我想编写一个返回函数列表的函数。作为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。
答案 0 :(得分:15)
Closures 绑定,这意味着他们将在调用时定义的范围内使用i
的最后一个值(在这种情况下,i
的最后一个值将是2
)。
通常的解决方案是将i
的值作为默认参数提供:
temp = lambda x, i=i: x + i
由于Python在构造函数期间评估默认参数,这是一个技巧,可以帮助Python在调用callable时使用正确的i
值,它不会创建一个闭包,而是,可以在它的当地人看i
。