类变量被创建的实例共享么?答案是共享!
今天被一篇文章误导了,文章写到:类变量在创建实例时,会复制给实例,而本身不被共享。经过探究,这个是错的
贴下例子代码:
class A:
x = []
y = 0
def __init__(self):
pass
def add(self):
self.x.append('1')
self.y+=1
a=A()
print a.x,a.y
print A.x,A.y
a.add()
print a.x,a.y
print A.x,A.y
b=A()
print b.x,b.y
print A.x,A.y
运行结果:
[] 0
[] 0
['1'] 1
['1'] 0
['1'] 0
['1'] 0
Class中的变量x已经被修改了,Python中的机制为,创建实例后,如果调用a.x属性,会在实例中寻找,如果没有的话,会往上寻找类A,如果有,就直接调用类A的类变量。
例子中的self.y经过self.y += 1后已经创建了实例属性,而self.x的append操作并不会创建实例属性,从而导致python去A中寻找x并且直接修改,这里我们也清楚的看到了,类的变量是所有实例共享的。
解决此案例中类变量被修改问题:
class A:
x = []
y = 0
def __init__(self):
pass
def add(self):
self.x = list(self.x)
self.x.append('1')
self.y+=1
a=A()
print a.x,a.y
print A.x,A.y
a.add()
print a.x,a.y
print A.x,A.y
b=A()
print b.x,b.y
print A.x,A.y
新建list x
有关解析文章:
https://www.cnblogs.com/lpworkstudyspace1992/p/6071355.html