实例变量被视为类变量(即实例之间共享)

时间:2019-05-31 02:14:35

标签: python python-2.x

看到奇怪的行为,其中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

0 个答案:

没有答案