2011-06-14 53 views
6

我一直在嘗試使用列表理解生成Python中的lambda函數列表。但它沒有工作,列表的Python lambda函數無部分

例如

fl=[lambda x: x**i for i in range(5)] 

我有檢查的其他問題,它基本上基於我的基準相同的功能。

所以我也試過部分。

from functools import partial 

fl=[partial(lambda x: x**i) for i in range(5)] 

但它沒有工作。任何幫助將不勝感激。歡呼聲〜

+0

@Jeff梅爾卡'FL [0](2)= FL [1](2)= 16' – phihag 2011-06-14 18:42:41

+0

嗯,這是正常的一個謎。我不認爲有一種方法可以讓我不被更新,因爲它是對循環變量的引用。爲什麼你要創建這個函數列表?是否有可能使用不同的方法解決您的大問題? – 2011-06-14 19:54:32

回答

6

You're tripping over Python scopes

fl=[lambda x, i=i: x**i for i in range(5)] 
+0

有趣。所以Python在這種情況下似乎表現得與JavaScript類似。 – 2011-06-14 18:43:10

+0

這與範圍確定無關。這是由於解釋了外部作用域的「關閉*變量*」(Python選擇共享同一個變量而不是複製其值),這與許多其他語言(例如JS和C#)的工作方式確實是相同的。 – delnan 2011-06-14 18:46:08

+1

它與範圍確定有關。每個lambda具有相同的範圍,這意味着它們都具有相同的變量。如果變量發生變化,所有lambda表達式的結果也會變化。將該值指定爲lambda的默認參數意味着它們不再需要訪問(或者甚至*保持*)外部範圍。 – 2011-06-14 18:48:54

6

你實際上按名稱傳遞了i

fl=[lambda x: x**i for i in range(5)] 

每次執行lambda時,它結合相同i的功能,所以在執行該功能時(後)它使用的i當時最新的值(這將是4)。你應該把它作爲一個默認參數,而不是:

fl=[lambda x, j=i: x**j for i in range(5)] 

事實上,我注意到,你在濫用partial。這裏:

fl = [partial(lambda x, y: y ** x, i) for i in range(5)] 

這也適用。

+0

感謝的人,其實我=我也使它的工作〜 – 2011-06-14 18:50:28

+0

@jerry,是的,我剛剛使用'j'因爲它使它更清楚發生了什麼(反正我腦海裏)。 – senderle 2011-06-14 18:51:42

4

另一種常見的解決方法是使用一個封閉件:

def create_f(i): 
    def f(x): 
     return x**i 
    return f 

fl = [create_f(i) for i in range(5)]