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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值