Eli*_*Eli 2 python lambda closures sum
我正在尝试执行以下操作,这是我最终目标的代表性示例:
yu = lambda x: 0
for i in range(0,5):
yu = lambda x: i + yu(x)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它返回:
RuntimeError: maximum recursion depth exceeded
当我做:
print yu(0)
Run Code Online (Sandbox Code Playgroud)
print语句应返回10.
这样做的正确方法是什么?
最后,你有:
yu = lambda x: i + yu(x)
Run Code Online (Sandbox Code Playgroud)
但是yu会在运行时查找,而不是在构造lambda时.改为:
for i in range(0,5):
yu = lambda x, yu=yu: i + yu(x)
Run Code Online (Sandbox Code Playgroud)
但这并没有回归10.它返回20:
>>> yu = lambda x: 0
>>> for i in range(0,5):
... yu = lambda x, yu=yu: i + yu(x)
...
>>> yu(0)
20
Run Code Online (Sandbox Code Playgroud)
因为现在i仍然从上下文中查找(现在循环已完成,所以它是4).解?移动i到一个关键字参数太多:
for i in range(0,5):
yu = lambda x, yu=yu, i=i: i + yu(x)
Run Code Online (Sandbox Code Playgroud)
现在这个工作:
>>> yu = lambda x: 0
>>> for i in range(0,5):
... yu = lambda x, yu=yu, i=i: i + yu(x)
...
>>> yu(0)
10
Run Code Online (Sandbox Code Playgroud)
故事的道德启示?将您的上下文正确绑定到lambda的范围.
| 归档时间: |
|
| 查看次数: |
6312 次 |
| 最近记录: |