Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python实例变量初始化_Python_Initialization_Instance - Fatal编程技术网

python实例变量初始化

python实例变量初始化,python,initialization,instance,Python,Initialization,Instance,我对python实例变量初始化的以下情况感到困惑,如果我没有在构造函数中为attr指定值,多个实例(i1和i2)将被分配相同的“attr”对象。如果我在构造函数中显式指定值,则会得到不同的对象 示例代码: 输出: 为什么i1和i2具有相同的“attr”对象?您可以创建一个默认列表attr=[]。该列表仅创建了一次。每次访问该方法而不查看attr,它都会使用先前创建的默认列表attr=[]。 在第二个示例中,每次调用MyClass(attr=[1,2])时,您都会不断为记录创建一个新的列表,尽管这

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

示例代码: 输出:
为什么i1和i2具有相同的“attr”对象?

您可以创建一个默认列表
attr=[]
。该列表仅创建了一次。每次访问该方法而不查看
attr
,它都会使用先前创建的默认列表
attr=[]

在第二个示例中,每次调用
MyClass(attr=[1,2])

时,您都会不断为记录创建一个新的列表,尽管这是一个重复的问题,但这是一个写得很好的问题。很清楚,有代码,显示示例输出,演示您自己找出了关键区别,等等。应该有一个类似Python的常见问题解答,其中包含指向该问题的链接。感谢大家的帮助,现在我在阅读了现有帖子后理解了,但这对我来说是一个惊喜,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