Chi*_*nex 3 python closures scope functional-programming
我试图从函数返回一个函数列表,每个函数使用来自外部作用域的变量.这不起作用.这是一个展示正在发生的事情的例子:
a = []
for i in range(10):
a.append(lambda x: x+i)
a[1](1) # returns 10, where it seems it should return 2
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我怎样才能在python 2.7中解决这个问题?
kin*_*all 11
的i是指每一次相同的变量,因此i是在所有的lambda表达式9,因为这是的值i在循环的结束.最简单的解决方法涉及默认参数:
lambda x, i=i: x+i
Run Code Online (Sandbox Code Playgroud)
这将循环的值绑定i到ilambda定义时的局部变量.
另一个解决方法是定义一个定义另一个lambda的lambda,并调用第一个lambda:
(lambda i: lambda x: x+i)(i)
Run Code Online (Sandbox Code Playgroud)
如果你考虑这个,这种行为会更有意义:
def outerfunc():
def innerfunc():
return x+i
a = []
for i in range(10):
a.append(innerfunc)
return a
Run Code Online (Sandbox Code Playgroud)
这里innerfunc定义了一次,因此直观地说你只使用单个函数对象,并且你不希望循环创建十个不同的闭包.对于lambda,它看起来不像函数只被定义一次,看起来你每次都通过循环定义它,但事实上它在功能上与长版本相同.
| 归档时间: |
|
| 查看次数: |
1299 次 |
| 最近记录: |