這是一個簡單的示例,顯示了我不理解的問題
callbacks = [lambda : 1, lambda : 2]
for i, c in enumerate(callbacks):
if i == 0:
cb1 = c
cb2 = lambda : c()
print(cb1()) # print 1
print(cb2()) # print 2
似乎在 cb1 中,我能夠正確地復制“正確”回呼,即我在回圈迭代中參考的回呼但是在 cb2 中,即使我在 c 參考時定義 cb2第一個回呼,之后更新為參考第二個回呼
有人可以說明發生了什么嗎?這很令人不安
是否有可能我為 cb2 撰寫了一個 lambda 并且仍然參考第一個回呼?
uj5u.com熱心網友回復:
這是預期的行為。要了解原因,請考慮以下示例:
x = 1
def d():
return x
d() # returns 1
x = 2
d() # now returns 2
在上面的示例中,函式 d 回傳在執行時分配給變數 x 的任何值。封閉范圍內的變數不會復制到函式體中,而是被參考。如果變數包含函式值,也是如此。請記住,函式只是 Python 中的值。行為不會因為您使用 lambda 語法來定義函式而改變。
uj5u.com熱心網友回復:
當 lambdac已經更改時,它會在運行時進行評估。
試試這個:
cb2 = lambda c=c: c()
使用默認值,您可以固定某個區域變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442827.html
標籤:Python python-3.x
上一篇:Boto3上傳資料的問題
