2012-04-04 21 views
1

可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument__init __(self,list = [])只爲每個實例化創建一個列表而不是一個新列表?

爲什麼是這樣的:

class Test: 
    def __init__(self, items=[]): 
     self.items=items 

與此不同:

class Test2: 
    def __init__(self, items=None): 
     if items: 
      self.items=items 
     else: 
      self.items = [] 

茨艾倫Ë看起來他們應該做同樣的事情,但:

>>>t = Test() 
>>>t.items.append("stuff") 
>>>t.items 
['stuff'] 
>>>t2 = Test() 
>>>t2.items 
['stuff'] 

好了,用測試(),只有一個正在創建的列表,每個人都在訪問它,儘管我認爲是明確設置的項目構造函數,而不是放在類名稱空間中。但與Test2:

>>>t = Test2() 
>>>t.items.append("stuff") 
>>>t.items 
['stuff'] 
>>>t2 = Test2() 
>>>t2.items 
[] 

這是我期望的方式工作。如果使用空列表顯式調用它,測試也不會在實例之間共享數據,而不是讓默認執行工作,如在t = Test([])中。

那麼它是隻在編譯時創建一次,而不是動態的?這隻適用於類定義,而不適用於一般的函數,或者這是在參數列表中使用默認值的更常見的陷阱? (答案:它也適用於函數。)

請注意,我使用字符串而不是列表測試了這種情況,並獲得了預期的行爲,即數據未在實例​​之間共享。但它確實也發生在字典中。

回答

相關問題