看到奇怪的行为,其中python2类中的实例self
变量被视为共享类变量,并且似乎与构造函数__init__
方法参数包含默认值时相关。下面提供了一个示例:
没有,实例变量在构造函数中具有默认值...
class A:
def __init__(self):
self.mutable_data = []
pass
def set_data(self, l):
assert isinstance(l, list)
self.mutable_data.extend(l)
pass
def get_data(self):
print self.mutable_data
pass
inst1 = A()
inst2 = A()
inst1.set_data([1, 2, 3])
inst1.get_data()
inst2.set_data([4, 5, 6])
inst1.get_data()
inst2.get_data()
...事情看起来像预期的
[1, 2, 3]
[1, 2, 3]
[4, 5, 6]
但是使用将默认值添加到了构造函数参数中……
class A:
def __init__(self, data=[]):
self.mutable_data = data
pass
<same class defs>
<same calls as before>
...我们看到这种行为,每个实例的self
变量就像共享类变量一样起作用
[1, 2, 3]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
这与类型是可变类型(基于帖子here进行猜测)有关吗?谁能帮忙解释一下?
经过更多谷歌搜索后,该问题似乎与https://stackoverflow.com/a/2899670/8236733相同。但是,我打算将其发布给其他人查找,因为只有通过专门搜索“可变的默认构造函数类型是可变的”,我才能够找到相关的答案(部分假设您已经知道,有些,问题的原因)。
我认为这是一个很好的解释:https://stackoverflow.com/a/1145781/8236733