今天我探索了 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 不会像其他语言那样创建一个新变量)。我怎样才能修复上面的代码,以便每个闭包都返回另一个值?
最简单的方法是为你的 lambda 使用默认参数,这样 x
的当前值被绑定(bind)为函数的默认参数,而不是 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