2011-08-10 61 views
0

我需要編寫一個函數,它返回一個和函數列表,並將輸入數字添加到某個綁定值。這是我做過什麼:發生器和實際變量值

def addition_range(start, end): 
    if start >= end: return None 

    #res = ((lambda x: x + i) for i in range(start, end)) #1 
    res = [ (lambda x: x + i) for i in range(start, end) ] #2 

    return res 

for i in addition_range(0, 5): print(i(2)) 

輸出應該是這樣的:2,3,4,5,6,但它是6,6,6,6,6

的問題是「我」變量,當我調用函數時,它們使用i(4)的實際值,而不是在生成列表過程中使用的值。問題可以簡單地通過使用(#1)來解決(#2),但我感興趣的是有沒有解決方案(#2)?我試過

res = [ (lambda x: x + copy.deepcopy(i)) for i in range(start, end) ] 

但它沒有幫助。

謝謝。

的WinXP +的Python 3.2

回答

1

解決這個最簡單的方法是通過將一個虛設參數:

def addition_range(start, end): 
    res = [(lambda x, i=i: x + i) for i in range(start, end)] 
    return res or None 

僞參數是在拉姆達被定義的時間來評價,而你的版本評估i只有當lambda被調用時。

備註:我添加了or None部分來模擬您實現的確切行爲。這可能會更好地返回一個空列表,而不是None

def addition_range(start, end): 
    return [(lambda x, i=i: x + i) for i in range(start, end)] 
+0

謝謝,它的工作原理! – fogbit