运行下面的示例代码:
class S:
i = 0
a = []
def __init__(self):
self.i += 1
self.a.append(1)
s1 = S()
print((s1.i, s1.a))
s2 = S()
print((s2.i, s2.a))
输出将是:
(1, [1])
(1, [1, 1])
Why is int
S.i
重置为 0s2
但是list
S.a
不重置为空?我认为这与不变有关int
与可变的list
但是有人可以帮助表达更多细节在两次 init 调用期间两个类变量发生了什么吗?
所以当你调用时你正在改变实例属性s1.i
or s1.a
。要更改类属性,请尝试以下操作:
S.i += 1
S.a.append(1)
在你的构造函数中你初始化self.a
and self.i
。这将创建属于该类的每个实例的实例属性。
The a
和i
在构造函数外部声明的是类属性,并且由所有实例共享。
原因s1.a
and S.a
无论使用哪个属性都会更新,因为列表是可变的,并且实例变量和类变量都是对同一列表的引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)