2012-03-22 109 views
0

可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument爲什麼在再次調用函數時這個字典不會被清空?

我工作的一本詞典時,我注意到,如果你有一個空的字典作爲函數的輸入,給它在功能上輸入後,下次該函數被調用時,字典不再爲空。我有麻煩解釋了我的意思,所以我希望下面的代碼段解釋了我的意思是:

>>> def test(input, dct={}): 
...  dct[input] = 'test' 
...  print dct 
... 
>>> test('a') 
{'a': 'test'} 
>>> test('b') 
{'a': 'test', 'b': 'test'} 

我的問題歸結爲:爲什麼在這個示例腳本,做試驗(「B」)時,不其打印

{'a':'test', 'b':'test'} 

,而不是

{'b':test'} 
+0

請參閱[Python教程](http://docs.python.org/tutorial/controlflow.html#default-argument-values)中的「重要警告」。我們每週至少得到一次這個問題...... – 2012-03-22 14:53:33

+0

對不起,我沒有找到它,我沒有搜索'在Python中最小的驚訝'或'可變的默認參數' – 2012-03-22 14:56:32

+0

這裏有幾百個問題在SO上。事實經常表明,這似乎確實很難找到,但我不知道如何改善這種情況。 – 2012-03-22 15:02:25

回答

1

因爲這裏dct={}使默認值dct始終指向同一個對象,而不是每次都創建一個空字典。這是Python程序員可能陷入的常見陷阱。

This article詳細解釋了這個問題。

1

的函數參數,蟒蛇只初始化一次。如果你希望它是每次調用,只需將它初始化爲函數內的空字典。

相關問題