2014-01-07 118 views
3

好日子,lambda表達式和詞典

我很困惑與以下:

v = {} 

v[-1] = lambda x: 1 
v[0] = lambda x: x 

for k in range(1, n): # k = 1...n-1 
    v[k] = lambda x: 2*x*v[k-1](x) - v[k-2](x) 

當我打電話,說,v[3](1)產生一個錯誤maximum recursion depth exceeded,而這一點:

v = {} 

v[-1] = lambda x: 1 
v[0] = lambda x: x 

v[1] = lambda x: 2*x*v[1-1](x) - v[1-2](x) 
v[2] = lambda x: 2*x*v[2-1](x) - v[2-2](x) 
v[3] = lambda x: 2*x*v[3-1](x) - v[3-2](x) 

工作得很好。我無法弄清楚在第一種情況下Python的投訴是什麼。建議會有幫助。

回答

3

由於因巴爾羅斯指出,k是一個全球性的,並在創建拉姆達時,不進行評估。然而,有一種方法可以有蟒蛇在聲明時評估K:

for k in range(1, n): # k = 1...n-1 
    v[k] = lambda x, k=k: 2*x*v[k-1](x) - v[k-2](x) 

k=k聲明一個變量k,本地的拉姆達,可選的,這是目前的k值默認值申報。

3

Python中的Lambdas被封閉。在評估Lambda之前,您給Lmabda的參數不會被評估。不管怎麼說,因爲你的迭代已經完成了,所以不管怎麼樣,k=n

證明:

>>> l = {} 
>>> for k in range(1, 10): 
    l[k] = lambda x: k 
>>> for v in l.values(): 
    print v('') 


9 
9 
9 
9 
9 
9 
9 
9 
9 
+2

另外,使用'dis'模塊,'dis.dis(v [1])給出了這條有趣的一行:'10 LOAD_GLOBAL 1(k)',它表明k的值在循環期間不被評估。 – njzk2

+0

這就是問題所在,但您還沒有提出解決方案。 – martineau

+0

問題是「什麼導致了這種行爲」而這回答了這個問題。我不能完全提供解決方案,因爲現在OP知道他的計劃不奏效,他應該提出一個新想法,如果他有問題,他可以問另一個問題,另外,@ njzk2提供了一個解決方案,可以爲OP工作(儘管它可能不是OP想要的) –