最近有很多小伙伴反应,有点搞不清 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 中的关键字。另外,实例变量只能通过实例对象访问,不能像类变量一样可以通过类名访问,这是因为实例变量存的都是一些实例对象特有的属性值。