2017-03-05 73 views
0

我想更新一個Python lambda函數多次,例如,更新lambda函數反覆在循環

f = lambda x: 0 
for t in range(10): 
    g_t = .... # some function independent of f 
    f = lambda x: f(x) + g_t(x) # update f for 10 times 

叫F給出我:

... 

File "<stdin>", line 3, in <lambda> 

File "<stdin>", line 3, in <lambda> 

... 

File "<stdin>", line 3, in <lambda> 

RuntimeError: maximum recursion depth exceeded 

反正來解決這個問題?

+1

什麼是你正在試圖解決的實際任務是什麼? – TigerhawkT3

+2

單獨這個代碼不會導致堆棧溢出,因爲您從不調用該函數。請提供所有必要的代碼來重現您所描述的錯誤 –

回答

3

如果您在粘貼代碼段後調用f,您將獲得無限遞歸,並且最終將超過最大堆棧深度。

這是因爲Python的封閉是詞法捕獲的,這意味着它們指向範圍內的變量名,而不是創建lambda時的變量的特定值。當最終值f被調用時,f(x)表達式將遞歸地調用最終值f,而不是來自先前迭代的值。

的解決方法是在它傳遞的f的電流值作爲參數傳遞給正在創建新的λ,而不是收盤:

f = lambda x: 0 
for t in range(10): 
    g_t = lambda x: 1 # some function independent of f 
    f = lambda x, curr_f=f: curr_f(x) + g_t(x) # pass f as a default argument to the lambda 
print(f(0)) # prints 10, no stack overflow 
+0

它的工作原理。非常感謝! – wolfustc

+0

優秀的答案! 'f = lambda x,f = f:f(x)+ g_t(x)'這一行是神祕的,但卻是pythonic! :P – varun

+0

@varun對不起,並不打算讓人覺得神祕。我只是給lambda添加了一個名爲'f'的額外參數,並立即將變量'f'作爲默認值。 –