gpt4 book ai didi

python - 是否有一种 Pythonic 方式来关闭循环变量?

转载 作者:IT老高 更新时间:2023-10-28 20:47:26 25 4
gpt4 key购买 nike

我刚刚遇到了 Eric Lippert 的 Closing over the loop variable considered harmful通过 SO,经过实验,发现 Python 中存在同样的问题(而且更难解决)。

>>> l = []
>>> for r in range(10):
... def foo():
... return r
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc

而且,标准的 C# 解决方法不起作用(我假设是因为 Python 中引用的性质)

>>> l = []
>>> for r in range(10):
... r2 = r
... def foo():
... return r2
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc

我认识到这在 Python 中并不是什么大问题,因为它普遍强调非闭包对象结构,但我很好奇是否有一种明显的 Pythonic 方式来处理这个问题,或者我们是否必须这样做嵌套函数调用的 JS 路由来创建实际的新变量?

>>> l = []
>>> for r in range(10):
... l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
... f()
...
0
1
2
# etc

最佳答案

一种方法是使用具有默认值的参数:

l = []
for r in range(10):
def foo(r = r):
return r
l.append(foo)

for f in l:
print(f())

产量

0
1
2
3
4
5
6
7
8
9

这是可行的,因为它在 foo 的本地范围内定义了一个 r,并在 foo 为定义。


另一种方法是使用函数工厂:

l = []
for r in range(10):
def make_foo(r):
def foo():
return r
return foo
l.append(make_foo(r))

for f in l:
print(f())

这是可行的,因为它在 make_foo 的本地范围内定义了 r,并在调用 make_foo(r) 时将值绑定(bind)到它.稍后,当调用 f() 时,使用 LEGB rule 查找 r .虽然 rfoo 的本地范围内找不到,但在 make_foo 的封闭范围内找到。

关于python - 是否有一种 Pythonic 方式来关闭循环变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com