扩展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都有一个共享属性。这通常是不需要的。
这是当类型是可变的时定义实例变量的默认值的Pythonic方法:
>>> 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不能更改。原因主要是哈希,我相信。