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

Python 在循环中迭代更新lambda函数,python,lambda,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 打电话给f给我: ... File "<stdin>", line 3, in <lambda> File "<stdin>",

我想多次更新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
打电话给f给我:

...

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

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

...

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

RuntimeError: maximum recursion depth exceeded
。。。
文件“”,第3行,在
文件“”,第3行,在
...
文件“”,第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

如果在粘贴代码段后调用
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

您试图解决的实际任务是什么?仅此代码不会导致堆栈溢出,因为您从未调用此函数。请提供再现您描述的错误所需的所有代码。您试图解决的实际任务是什么?仅此代码不会导致堆栈溢出,因为您从未调用此函数。请提供再现您描述的错误所需的所有代码。非常好的答案!行
f=lambda x,f=f:f(x)+g_t(x)
是神秘的,但又是pythonic!:P@varun对不起,我不想让这件事变得神秘。我只是在lambda中添加了一个名为
f
的额外参数,并立即将变量
f
作为其默认值传递。它是pythonic的,尽管它很神秘。我的意思是恭维你!在理解这句话之前,你可能需要把它通读几遍。这是一个使用默认参数作为函数的聪明方法:)回答得很好!行
f=lambda x,f=f:f(x)+g_t(x)
是神秘的,但又是pythonic!:P@varun对不起,我不想让这件事变得神秘。我只是在lambda中添加了一个名为
f
的额外参数,并立即将变量
f
作为其默认值传递。它是pythonic的,尽管它很神秘。我的意思是恭维你!在理解这句话之前,你可能需要把它通读几遍。这是一种将默认参数用作函数的聪明方法:)