Python中类变量与实例变量问题

类变量被创建的实例共享么?答案是共享!

今天被一篇文章误导了,文章写到:类变量在创建实例时,会复制给实例,而本身不被共享。经过探究,这个是错的

贴下例子代码:

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


你可能感兴趣的:(Python)