2012-11-08 25 views
3

可能重複:
What do (lambda) function closures capture in Python?關閉可變

我有把幾個lambda函數在字典中的這個Python代碼:

dictfun = dict() 
for txt in ("a", "b", "c"): 
    dictfun[txt] = lambda: "function " + txt 

這些功能只是使用它們被調用的參數返回一個字符串。
我期望看到像function a的輸出dictfun["a"]()function bdictfun["b"]()等等,但是這是我得到:

>>> dictfun["a"]() 
'function c' 
>>> dictfun["b"]() 
'function c' 
>>> dictfun["c"]() 
'function c' 

看來,他們都評價txt給它設置的最後一個值,即其當前價值。總而言之,這個變量不會被關閉到lambda表達式中。我甚至可以這樣做:

>>> txt = "a" 
>>> dictfun["c"]() 
'function a' 

我怎麼可能爲了得到我的預期產出關閉txt到lambda函數?

+2

確實http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture -in-python回答你的問題?看起來有點像傻瓜 – ThiefMaster

+0

@ThiefMaster:它的確如此,我看到我在這裏提出的答案中使用的相同技巧。 –

+0

D'oh ...儘管問題並不完全一樣,但我的問題的確存在一個答案。無論如何,這不是公認的目標,而是關於理解關閉而不是達到精確的目標。 – etuardu

回答

5

您可以設置的txt值作爲默認值的關鍵字參數:

dictfun = dict() 
for txt in ("a", "b", "c"): 
    dictfun[txt] = lambda txt=txt: "function " + txt