1、变量
python中实际有4种变量,分别是全局变量,类变量,实例变量,局部变量。
- 全局变量:类之外的变量,例如:
a_list = [] #全局变量
class TestVariable:
pass
在方法中给全局变量赋值需要使用global声明,例如:
a_list = []
def give_value():
#a_list = [1, 2, 3] # 错误的做法,如果没有声明global,方法内的a_list相当于新定义的一个局部变量,此处赋值,并不会改变全局变量的值。
global a_list
a_list = [1, 2, 3]
give_value()
print(a_list) #输出:[1, 2, 3]
需要注意的是就算把a_list=[]注释掉,执行give_value()方法后print(a_list)同样会输出[1, 2, 3],这是因为我们在give_value()方法中用global声明了一个全局变量a_list,就算外面没有显示声明,a_list也已经变成了一个全局变量。 有时会出现容易混淆的情况,如下:
class TestVariable:
b_list = []
def give_b_value(self):
global b_list
b_list = [1, 2, 3, 4]
tv = TestVariable()
tv.give_b_value()
print(tv.b_list) #输出:[]
print(TestVariable.b_list) #输出:[]
print(b_list) #输出:[1, 2, 3, 4] 注意不管在哪里只要声明了global变量,就可以直接调用global声明的变量
TestVariable类中声明了类变量b_list但是方法中又声明了相同名字的全局变量,这两个b_list变量有明显的区别,一个是类变量,一个是全局变量。如果要改变类变量的值应该使用<类名.类变量>TestVariable.b_list而不是用global声明全局变量。
- 类变量:类里面方法之外的变量,例如:
class TestVariable:
b_list = []
tv = TestVariable()
tv.b_list = [1, 2, 3, 4]
print(tv.b_list) #输出:[1, 2, 3, 4]
print(TestVariable.b_list) #输出:[]
tv1 = TestVariable()
print(tv1.b_list) #输出:[]
TestVariable.b_list = [1, 2, 3, 4, 5]
print(tv.b_list) #输出:[1, 2, 3, 4]
print(tv1.b_list)#输出:[1, 2, 3, 4, 5]
tv1.b_list = [1, 2]
print(tv1.b_list) #输出: [1, 2]
tv1.__class__.b_list = [1, 2, 3, 4, 5] #相当于TestVariable.b_list = [1, 2, 3, 4, 5]
print(tv.b_list) #输出:[1, 2, 3, 4]
print(tv1.b_list) #输出:[1, 2]
说明:
1.类的每个实例继承了b_list 属性及它在类中定义的值。
- 修改一个实例属性的值不影响其他实例,也不会修改类的属性。可以使用特殊的 class 属性来访问类属性(于此相对的是单独实例的属性)。
如果修改类属性, 所有仍然继承该实例的值的实例 (如这里的tv1没有给b_list赋值之前) 会受影响。
已经覆盖(overridden)了该属性(如这里已经赋值的tv1)的所有实例 将不受影响。
- 实例变量:每个实例的所拥有的变量
类中的每一个方法的第一个参数都是self,使用self.变量名来定义实例变量。











网友评论