Python的变量(全局变量、局部变量、类变量和实例变量)

最近有很多小伙伴反应,有点搞不清 Python 的全局变量、局部变量、类变量和实例变量的区别以及用法,那我们今天详细介绍一下这4种变量的作用域和用法。

全局变量

听名字就可以知道该变量的作用范围是全局的,全局变量定义在模块(包)内,类和函数外,模块内的所有类和方法均可以访问全局变量。一般情况下,如果定义了全局变量不做变量的更新的话,没有问题。一旦要给全局变量重新赋值的时候,往往有的小伙伴会掉坑里,下面我们举个例子:

BRAND = "BMW"


def change_brand(new_brand):
    BRAND = new_brand
    print("new brand is: "+BRAND)


def main():
    change_brand("宝马")
    print(BRAND)


if __name__ == '__main__':
    main()

以上代码中我们定义了一个全局变量 BRAND = "BMW",然后我们想通过 change_brand 函数对全局变量进行重新赋值,得到如下结果:

发现结果并不符合预期,print(BRAND) 得到的结果还是 BMW 并没有给全局变量 BRAND 重新赋值为 宝马,这是因为我们在 change_brand 函数中如果不声明 global 关键字是索引不到全局变量,相当于在 change_brand 函数中又重新创建了一个与全局变量同名的变量,现将代码修改为:

BRAND = "BMW"


def change_brand(new_brand):
    global BRAND
    BRAND = new_brand
    print("new brand is: "+BRAND)


def main():
    change_brand("宝马")
    print(BRAND)


if __name__ == '__main__':
    main()

局部变量

在介绍全局变量的第一段代码 change_brand 函数中的 BRAND 就是局部变量,局部变量是定义在函数中的变量,其作用域也是在其所属函数内,在所属函数之外调用该局部变量会报错:

def print_word():
    word = "car"
    print(word)
    

def main():
    # change_brand("宝马")
    # print(BRAND)
    print(word)


if __name__ == '__main__':
    main()

这是因为 word 变量定义在 print_word 函数中,main 函数访问不到该变量,所以会报错,局部变量随着函数被调用而创建,随着函数执行结束而释放。

类变量

类变量也叫静态变量,类变量定义在类中,但不在类的函数中,可以不必创建该类的实例,直接通过类名调用类变量,也可以通过实例名访问类变量,这个可以根据情况灵活采用哪种调用方式:

class Car(object):
    color = "blue"


def main():
    # change_brand("宝马")
    # print(BRAND)
    # print(word)
    print(Car.color)
    car = Car()
    print(car.color)


if __name__ == '__main__':
    main()

类变量的作用范围为所属类中,并能被由所属类的所有实例对象所访问,什么意思呢?就是小伙伴们通过类 Car 创建出的所有的 Car 的实例对象都可以访问到类 Car 中的类变量 color

实例变量

对于整个模块(包),定义了全局变量,可以让模块中的所有类的函数共享;对于函数来说,如果不想将自己的私有变量共享,可以定义局部变量,那么除了函数本身外,“外界” 不会知道函数内部定义的变量;对于类,有了类变量,可以供类中和有血缘关系的类或者实例对象之间进行共享使用,也可以简单理解类变量为各个实例对象的 “共有属性值”,比如,校园的选课系统面向的全是学生,那么属性 title = student 可以声明成类变量,但是每个学生的学号,身高,体重等属性都是实例对象 Student 所特有的啊,那么该如何来描述这些特有属性呢?这就要靠实例变量了,这里我们引用上一篇介绍 Python 的类 class 的例子学习一下实例变量的用法:https://www.jianshu.com/p/c662dc5497cc

class Student(object):
    tuition_fee = 12000

    def __init__(self, name, sex):
        print("这是类的初始化方法")
        self.name = name
        self.sex = sex
        print("类初始化完毕")

    def speak(self):
        print("student, name=", self.name, "; sex=", self.sex, "; tuition_fee=", self.tuition_fee)


def main():
    student = Student("wangcai", "male")
    student.speak()
    student.name = "xiaoqaing"
    student.speak()


if __name__ == '__main__':
    main()

小伙伴们可以观察到,实例变量都是用 self 来修饰,表示类的实例对象,当然也可以把 self 换成别的标识,这是因为 self 并不是 Python 中的关键字。另外,实例变量只能通过实例对象访问,不能像类变量一样可以通过类名访问,这是因为实例变量存的都是一些实例对象特有的属性值。

你可能感兴趣的:(Python的变量(全局变量、局部变量、类变量和实例变量))