python - 如何强制 Python 在循环内创建新变量/新范围?

标签 python variables for-loop parameters closures

<分区>

今天我探索了 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

关于python - 如何强制 Python 在循环内创建新变量/新范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11366375/

相关文章:

python - 解释 Excel 货币值

javascript - 动态 jQuery 变量名

javascript - 为什么我的私有(private)变量被改变了?

r - 如何返回 R 中两个 data.frames 之间匹配行的索引

c - 为什么我的程序跳过 for 循环? C

arrays - perl foreach 循环数组,简单的问题

python - Google Colab 在 pip 安装时抛出错误

Python:反转字符串

python - 对列不同的地方进行分组

java - 是否可以将方法级变量设置为类级变量?