2009-04-17 33 views
3
a = [] a.append(lambda x:x**0) 
a.append(lambda x:x**1) 

a[0](2), a[1](2), a[2](2)... spits out 1, 2, 4, ... 

b=[] 
for i in range(4) 
    b.append(lambda x:x**i) 

b[0](2), b[1](2), b[2](2)... spits out 8, 8, 8, ... 

在for循環中,i被傳遞到lambda作爲一個變量,所以當我調用它,i的最後一個值是所使用的代碼,而不是運行因爲它與[]。 (即b [0]應該使用x^1,b [1]應該使用x^2,...)使用價值

如何告訴lambda拿起i的值而不是變量i本身。

+1

-1:Lambda表達式:-(。只需定義一個函數,就可以清楚發生了什麼。 – 2009-04-17 14:52:41

+0

在引用(僞)代碼之前,我會建議您在提問時解釋您的問題/情況。 – physicsmichael 2009-04-17 18:30:17

回答

6

醜,只有一種解釋:(所有測試的代碼)

for i in range(4) 
    b.append(lambda x, copy=i: x**copy) 

你可能更喜歡

def raiser(power): 
    return lambda x: x**power 

for i in range(4) 
    b.append(raiser(i)) 

2
b=[] 
f=(lambda p:(lambda x:x**p)) 
for i in range(4): 
    b.append(f(i)) 
for g in b: 
    print g(2) 
2

定義工廠

def power_function_factory(value): 
    def new_power_function(base): 
     return base ** value 
    return new_power_function 

b = [] 
for i in range(4): 
    b.append(power_function_factory(i)) 

b = [power_function_factory(i) for i in range(4)]