Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 2.7 为什么实例变量(列表)会在for循环中增长?_Python 2.7_Instance Variables - Fatal编程技术网

Python 2.7 为什么实例变量(列表)会在for循环中增长?

Python 2.7 为什么实例变量(列表)会在for循环中增长?,python-2.7,instance-variables,Python 2.7,Instance Variables,在下面的代码中,我希望每次在for循环中都会创建一个名为“obj”的MyClass的新实例。因此,每次输出应为[1]。但obj.mylist似乎在增长。我错过了什么 class MyClass: def __init__( self, mylist_=[] ): self.mylist = mylist_ def addData( self ): self.mylist.append( 1 ) for i in range(5): o

在下面的代码中,我希望每次在for循环中都会创建一个名为“obj”的MyClass的新实例。因此,每次输出应为[1]。但obj.mylist似乎在增长。我错过了什么

class MyClass:
    def __init__( self, mylist_=[] ):
        self.mylist = mylist_ 

    def addData( self ):
        self.mylist.append( 1 )

for i in range(5):
    obj = MyClass()
    obj.addData()
    print obj.mylist
输出为:

[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1, 1]

长话短说,参数的默认值在定义函数的语句执行时创建一次

请参阅:

默认值在定义范围内的函数定义点进行计算,以便

重要警告:默认值仅计算一次。当默认值是可变对象(如列表、字典或大多数类的实例)时,这会有所不同

-

此参考还包含不遵循警告的示例-非常类似的情况和观察到的行为

其他参考资料:

  • 不是bug:

有一个很好的逻辑解释@Andrew L--不,这里的问题是使用可变默认参数,而不是问题所在。@bgporter是的,我的错。收回:@skovorodkin上面列出的帖子对这个问题来说是一个很好的欺骗。我在@skovorodkin的评论中找到了以下链接,它回答了我的问题: