2011-04-19 13 views
24

這是一個函數。我的意圖是使用關鍵字參數的默認值,使字典如果沒有提供空字典。空字典作爲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。

+1

這是一個典型的疑難雜症蟒:[易變默認值功能/方法的參數](http://pythonconquerstheuniverse.wordpress.com/category/python-gotchas/) – 2011-04-19 07:27:32

回答

2
>>> def f(i, d=None, x=3): 
...  if not d: 
...   d={} 
...  d[i] = i*i 
...  x += i 
...  return x,d 
... 
>>> f(2) 
(5, {2: 4}) 
>>> f(3) 
(6, {3: 9}) 
>>> 
+1

我們可以將其定義爲d = d或{}。 – 2016-10-21 05:52:18

相關問題