我怎么能强迫Python创建循环中有一个新的变量/新范围是什么? [重复](How can I

2019-09-19 04:39发布

今天我探索的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不会创建一个新的像在其他语言)。 如何解决上面的代码,使每封将返回另一个值?

Answer 1:

要做到这一点,最简单的方法是使用默认参数为您的拉姆达,这样的电流值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


Answer 2:

你不能在循环内的局部范围内创建一个新的变量。 无论你选择的名字,你的函数总是会在该名称的关闭和使用它的最新值。

解决这个问题的最简单的方法是使用关键字参数:

closures = []
for x in [1, 2, 3]:
    closures.append(lambda var=x: var)


Answer 3:

在你的榜样, var总是绑定到循环的最后一个值。 您需要使用绑定它的拉姆达内部closures.append(lambda var=var: var)



文章来源: How can I force Python to create a new variable / new scope inside a loop? [duplicate]