1

我对 python 实例变量初始化的以下情况感到困惑,如果我没有在构造函数中为 attr 指定值,则为多个实例(i1 和 i2)分配相同的“attr”对象。如果我在构造函数中明确指定值,则会得到不同的对象。

示例代码:

class MyClass:
    def __init__(self, x=1, attr=[]):
        print id(attr)
        self.attr = attr
        self.x = x

if __name__ == '__main__':
   
    i1 = MyClass()
    i2 = MyClass()
    i3 = MyClass(attr=[1,2])
    i4 = MyClass(attr=[1,2])

    print "i1:", vars(i1), id(i1.attr)
    print "i2:", vars(i2), id(i2.attr)
    print "i3:", vars(i3), id(i3.attr)
    print "i4:", vars(i4), id(i4.attr)

输出:

38648928
38648928
38664672
38688648
i1: {'x': 1, 'attr': []} 38648928
i2: {'x': 1, 'attr': []} 38648928
i3: {'x': 1, 'attr': [1, 2]} 38664672
i4: {'x': 1, 'attr': [1, 2]} 38688648

为什么 i1 和 i2 具有相同的“attr”对象?

4

1 回答 1

3

您创建一个默认列表attr=[]。该列表仅创建了 1 次。每次你在没有看到的情况下访问该方法时attr,它都会使用他之前创建的默认列表attr=[]。在第二个示例中,您每次调用都会不断创建一个新列表MyClass(attr=[1,2])

于 2013-11-02T22:30:27.610 回答