Python 2.7函数是否记住值而不是引用?关闭怪异

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)

这将循环的值绑定iilambda定义时的局部变量.

另一个解决方法是定义一个定义另一个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,它看起来不像函数只被定义一次,看起来你每次都通过循环定义它,但事实上它在功能上与长版本相同.