如何返回使用变量值的函数?

ahu*_*ura 13 python python-3.x

我想编写一个返回函数列表的函数.作为一个MWE,这是我的函数尝试,它给出了三个函数,它们将0,1和2添加到输入数字:

def foo():
    result = []
    for i in range(3):
        temp = lambda x: x + i
        print(temp(42))  # prints 42, 43, 44
        result.append(temp)
    return result

for f in foo():
    print(f(42))  #prints 44, 44, 44
Run Code Online (Sandbox Code Playgroud)

与我的期望相反,每个函数最终使用i的最后一个值.当我将一个列表用作函数的参数但Python实际上使用指向列表的指针时,我经历过类似的行为,但这里是一个整数,所以我不明白这里发生了什么.我正在运行Python 3.5.

Jim*_*ard 15

闭包绑定较晚,这意味着它们将使用i调用时定义的范围中的最后一个值(在这种情况下,i将是最后一个值2).

对此的常见解决方案是提供i作为默认参数的值:

temp = lambda x, i=i: x + i
Run Code Online (Sandbox Code Playgroud)

由于Python在构造函数期间评估默认参数,这是一个技巧,可以帮助Python i在调用callable时使用正确的值,它不会创建一个闭包,而是可以查找i它的本地.

  • 有关此答案的更多信息http://quickinsights.io/python/python-closures-and-late-binding/ (2认同)