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

时间:2017-02-02 13:22:01

标签: 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

与我的期望相反,每个函数最终都使用 i 所采用的最后一个值。例如,我遇到了类似的行为。列表用作函数的参数,但Python实际上使用指向列表的指针,但这里 i 是一个整数,所以我不明白这里发生了什么。我正在运行Python 3.5。

1 个答案:

答案 0 :(得分:15)

Closures 绑定,这意味着他们将在调用时定义的范围内使用i的最后一个值(在这种情况下,i的最后一个值将是2)。

通常的解决方案是将i的值作为默认参数提供:

temp = lambda x, i=i: x + i

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