這是一個函數。我的意圖是使用關鍵字參數的默認值,使字典如果沒有提供空字典。空字典作爲python函數中關鍵字參數的默認值:字典在後續調用中似乎未被初始化爲{}
>>> def f(i, d={}, x=3) :
... d[i] = i*i
... x += i
... return x, d
...
>>> f(2)
(5, {2: 4})
但是,當我下一次調用F,我得到:
>>> f(3)
(6, {2: 4, 3: 9})
它看起來像在第二次通話關鍵字參數d沒有指向一個空的字典,而是字典,因爲它在前面的電話結束時留下。每次呼叫時,號碼x重置爲三次。
現在我可以解決這個問題了,但是我想請你幫忙理解一下。我相信關鍵字參數在函數的本地範圍內,並且一旦函數返回就會被刪除。 (如果我不精確,請原諒並糾正我的術語。)
因此,名稱d指向的本地值應該被刪除,並且在下一次調用時,如果我沒有提供關鍵字參數d,那麼d應設置爲default {}
。但正如你所看到的,d正在被設置爲前面調用中指向的字典。
這是怎麼回事?
literal {}
是否在封閉範圍的def行中?
此行爲見於2.5,2.6和3.1。
這是一個典型的疑難雜症蟒:[易變默認值功能/方法的參數](http://pythonconquerstheuniverse.wordpress.com/category/python-gotchas/) – 2011-04-19 07:27:32