2013-11-02 155 views
1

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

示例代码:

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' 对象?

+1

对于记录,尽管这是重复的,但这是一个写得很好的问题。很明显,有代码,显示示例输出,演示了你自己想出的关键区别,等等。 – DSM

+0

应该像Python常见问题一样,链接到SO问题。 – Shashank

+0

谢谢大家的帮助,现在我在阅读完现有文章后明白了,但这对我来说是一个惊喜,Python应该是“最小的惊讶”:) – user2948769

回答

3

您创建一个默认列表attr=[]。该列表只创建了一次。每当您访问该方法而没有出现attr时,它会使用他之前创建的默认列表attr=[]。 在第二个示例中,您不断创建一个新列表,每次调用MyClass(attr=[1,2])