2016-10-07 40 views
1

在下面的代碼中,我期待每次在for循環中創建一個名爲'obj'的MyClass新實例。因此,每次輸出應爲[1]。但obj.mylist似乎增長。我錯過了什麼?爲什麼一個實例變量是一個列表,在for循環中增長?

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] 
+3

有一個很好的邏輯解釋http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument – skovorodkin

+0

@Andrew L - 不,這裏的問題是使用mutable默認的論點,而不是這個問題的問題。 – bgporter

+0

@bgporter是的,我的壞。收縮CV – Li357

回答

2

龍的故事的論點短,默認值是在被執行的定義函數聲明時創建一次

請參閱official documentation

的默認值在定義範圍函數定義的角度進行評價,使...

< ...>

重要警告:默認值僅評估一次。當默認值是可變對象(如列表,字典或大多數類的實例)時,這會有所不同。

< ...>

- 4.7.1. Default Argument Values — Python 3.5.2 documentation

該引用還包含不遵循警告的示例 - 一個非常相似的情況和觀察到的行爲。

其他參考:

相關問題