Python中类变量与实例变量问题
来源:互联网 发布:太平天国失败 知乎 编辑:程序博客网 时间:2024/06/01 10:23
类变量被创建的实例共享么?答案是共享!
今天被一篇文章误导了,文章写到:类变量在创建实例时,会复制给实例,而本身不被共享。经过探究,这个是错的
贴下例子代码:
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.yprint A.x,A.ya.add()print a.x,a.yprint A.x,A.yb=A() print b.x,b.yprint 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.yprint A.x,A.ya.add()print a.x,a.yprint A.x,A.yb=A() print b.x,b.yprint A.x,A.y
新建list x
有关解析文章:
https://www.cnblogs.com/lpworkstudyspace1992/p/6071355.html
阅读全文