亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創建Python Lambda列表(在列表理解/ for循環中)?

如何創建Python Lambda列表(在列表理解/ for循環中)?

catspeake 2019-11-03 04:04:48
我想從Python中的常量列表創建lambda對象列表;例如:listOfNumbers = [1,2,3,4,5]square = lambda x: x * xlistOfLambdas = [lambda: square(i) for i in listOfNumbers]但是,當我運行它們時,這將創建一個lambda對象列表:for f in listOfLambdas:    print f(),我希望它會打印1 4 9 16 25而是打印:25 25 25 25 25似乎所有lambda都被賦予了錯誤的參數。我做錯了什么,有辦法解決嗎?我認為我使用的是Python 2.4。編輯:更多嘗試的事情,例如這樣:listOfLambdas = []for num in listOfNumbers:    action = lambda: square(num)    listOfLambdas.append(action)    print action()打印從1到25的期望平方,然后使用之前的print語句:for f in listOfLambdas:    print f(),仍然給我所有25的。現有的lambda對象如何在這兩個打印調用之間改變?
查看完整描述

3 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

我猜想您在列表推導中創建的lambda綁定到變量i,最終變量i最終為5。因此,當您在事后求值時,lambda全部綁定為5并最終計算25.在第二個示例中,num也發生了同樣的事情。當您評估循環內的lambda時,num的值沒有改變,因此您獲得了正確的值。循環后,num為5 ...


我不太確定您要做什么,所以不確定如何提出解決方案。這個怎么樣?


def square(x): return lambda : x*x

listOfLambdas = [square(i) for i in [1,2,3,4,5]]

for f in listOfLambdas: print f()

這給了我預期的輸出:


1

4

9

16

25

另一種思考方式是,lambda在創建時就“捕獲”其詞法環境。因此,如果您給它num,它直到被調用時才真正解析該值。這既混亂又強大。



查看完整回答
反對 回復 2019-11-04
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

你有:


listOfLambdas = [lambda: i*i for i in range(6)]


for f in listOfLambdas:

    print f()

輸出:


25

25

25

25

25

25

您需要粗魯!除了美味之外,請使用此默認值“ hack”。


listOfLambdas = [lambda i=i: i*i for i in range(6)]


for f in listOfLambdas:

    print f()

輸出:


0

1

4

9

16

25

注意i=i。那就是魔術發生的地方。



查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 294 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號