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([])中。
那麼它是隻在編譯時創建一次,而不是動態的?這隻適用於類定義,而不適用於一般的函數,或者這是在參數列表中使用默認值的更常見的陷阱? (答案:它也適用於函數。)
請注意,我使用字符串而不是列表測試了這種情況,並獲得了預期的行爲,即數據未在實例之間共享。但它確實也發生在字典中。