2017-03-05 74 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'作为默认值。 –