我想多次更新python 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
打电话给我:
...
File "<stdin>", line 3, in <lambda>
File "<stdin>", line 3, in <lambda>
...
File "<stdin>", line 3, in <lambda>
RuntimeError: maximum recursion depth exceeded
无论如何要绕过这个?
答案 0 :(得分:3)
如果您在粘贴的代码段后调用f
,则会获得无限递归,并最终超过最大堆栈深度。
这是因为Python闭包是在词汇上捕获的,这意味着它们指向范围中的变量名,而不是创建lambda时的变量的特定值。当调用f
的最终值时,f(x)
表达式将递归调用f
的最终值,而不是上一次迭代的值。
解决方法是将当前值f
作为参数传递给您正在创建的新lambda,而不是关闭它:
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