今天我探索的Python的怪异行为。 一个例子:
closures = []
for x in [1, 2, 3]:
# store `x' in a "new" local variable
var = x
# store a closure which returns the value of `var'
closures.append(lambda: var)
for c in closures:
print(c())
上面的代码打印
3
3
3
但我想它打印
1
2
3
我解释这种行为对自己说, var
是永远不变的局部变量(和Python不会创建一个新的像在其他语言)。 如何解决上面的代码,使每封将返回另一个值?
要做到这一点,最简单的方法是使用默认参数为您的拉姆达,这样的电流值x
绑定为函数的默认参数,而不是var
在每次调用一个包含范围正在抬头:
closures = []
for x in [1, 2, 3]:
closures.append(lambda var=x: var)
for c in closures:
print(c())
另外,您可以创建一个闭包(你有什么不是封闭的,因为在全球范围内创建的每个功能):
make_closure = lambda var: lambda: var
closures = []
for x in [1, 2, 3]:
closures.append(make_closure(x))
for c in closures:
print(c())
make_closure()
也可以被写成这样,这可能使其更易于阅读:
def make_closure(var):
return lambda: var
你不能在循环内的局部范围内创建一个新的变量。 无论你选择的名字,你的函数总是会在该名称的关闭和使用它的最新值。
解决这个问题的最简单的方法是使用关键字参数:
closures = []
for x in [1, 2, 3]:
closures.append(lambda var=x: var)
在你的榜样, var
总是绑定到循环的最后一个值。 您需要使用绑定它的拉姆达内部closures.append(lambda var=var: var)
文章来源: How can I force Python to create a new variable / new scope inside a loop? [duplicate]