扩展bp的答案,我想向您展示他所说的不可变类型的含义。
首先,这没关系:
>>> class TestB():
... def __init__(self, attr=1):
... self.attr = attr
...
>>> a = TestB()
>>> b = TestB()
>>> a.attr = 2
>>> a.attr
2
>>> b.attr
1
但是,这仅适用于不可变(不变)类型。如果默认值是可变的(意味着可以替换),则将发生这种情况:
>>> class test():
... def __init__(self, attr=[]):
... self.attr = attr
...
>>> a = test()
>>> b = test()
>>> a.attr.append(1)
>>> a.attr
[1]
>>> b.attr
[1]
>>>
请注意,两者a
和b
都有共享属性。这通常是不需要的。
>>> class TestC():
... def __init__(self, attr=None):
... if attr is None:
... attr = []
... self.attr = attr
...
>>> a = TestC()
>>> b = TestC()
>>> a.attr.append(1)
>>> a.attr
[1]
>>> b.attr
[]
我的第一段代码起作用的原因是,对于不可变的类型,Python会在需要时创建它的新实例。如果需要将1加1,Python会为您创建一个新的2,因为旧的1无法更改。我相信,原因主要是散列。