在循环中迭代地更新lambda函数

时间:2017-03-05 07:49:45

标签: python lambda

我想多次更新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

无论如何要绕过这个?

1 个答案:

答案 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