我正在尝试执行以下操作,这是我最终目标的代表性示例:
yu = lambda x: 0
for i in range(0,5):
yu = lambda x: i + yu(x)
不幸的是,它返回:
RuntimeError:超出最大递归深度
当我这样做时:
print yu(0)
打印语句应返回 10。
正确的做法是什么?
最佳答案
最后,你有:
yu = lambda x: i + yu(x)
但是 yu
将在运行时 中查找,而不是在您构造 lambda 时查找。改为这样做:
for i in range(0,5):
yu = lambda x, yu=yu: i + yu(x)
不过,这不会返回10
。它返回 20
而不是:
>>> yu = lambda x: 0
>>> for i in range(0,5):
... yu = lambda x, yu=yu: i + yu(x)
...
>>> yu(0)
20
因为现在 i
仍然是从上下文中查找的(现在循环已经完成所以它是 4
)。解决方案?也将 i
移动到关键字参数:
for i in range(0,5):
yu = lambda x, yu=yu, i=i: i + yu(x)
现在这有效:
>>> yu = lambda x: 0
>>> for i in range(0,5):
... yu = lambda x, yu=yu, i=i: i + yu(x)
...
>>> yu(0)
10
故事的寓意?将您的上下文正确绑定(bind)到 lambda 的范围。
关于Python:求和的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124268/