我有一系列函數,例如:>>> def f():... print "f"... >>> def g():... print "g"... >>> c=[f,g]然后,我嘗試創建兩個lambda函數:>>> i=0>>> x=lambda: c[i]()>>> i+=1>>> y=lambda: c[i]()然后,給他們打電話:>>> x()g>>> y()g為什么lambda中的c [i]是相同的?
2 回答

慕哥9229398
TA貢獻1877條經驗 獲得超6個贊
這是因為lambda函數i在運行時獲取全局變量的值:
>>> i = 0
>>> x=lambda z = i : c[z]() #assign the current value of `i` to a local variable inside lambda
>>> i+=1
>>> y =lambda z = i : c[z]()
>>> x()
f
>>> y()
g

繁星淼淼
TA貢獻1775條經驗 獲得超11個贊
在Python中,閉包不捕獲實際值,而是捕獲名稱空間。因此,當您i在函數內部使用時,實際上是在封閉范圍內查找的。并且那里的價值已經改變。
您不需要所有這些lambda和列表都可以看到此內容。
>>> x = 1
>>> def f():
... print(x)
...
>>> x = 2
>>> def g():
... print(x)
...
>>> g()
2
>>> f()
2
添加回答
舉報
0/150
提交
取消