【发布时间】:2019-06-14 18:45:30
【问题描述】:
我是一位经验丰富的 C/C++(在某种程度上是 Java)程序员。我正在学习 python,但我对该语言的一些奇怪的(对于我的背景)行为感到困惑。
我正在学习嵌套函数和闭包(阅读“学习 Python”,这对我来说似乎是一个非常好的资源)。
我知道,如果我在调用创建的函数时将 def 嵌套在 for 循环中,它会查找捕获的循环变量的最后一个值(因为它通过引用捕获,正如 C++ 程序员所说的那样)
funcs = []
for i in range(4):
def f():
print(i)
funcs.append(f)
运行程序的结果是
>>> for f in funcs:
f()
3
3
3
3
现在,当我偶然发现这个(在我看来是什么)不一致时,我正在思考这个问题:如果我这样做
for i in range(4):
funcs[i]()
0
1
2
3
更莫名其妙,如果我这样做了
>>> i = 2
>>> funcs[i]()
2
现在,列表中的所有函数都返回 2:
for f in funcs:
f()
2
2
2
2
一定有一些我无法理解的范围相关问题
【问题讨论】:
-
由于缩进错误,您发布的第一个代码无法正常工作。
-
对不起,这是一个复制粘贴错误,我的代码是正确的,现在编辑它
-
我认为你搞砸了
funcs.append(f)上的缩进。我在这里可能有点不对劲,但print(i)将打印最后生成的i。在您的情况下,那是for i in range(4):而不是您定义函数时。所以你得到那个输出并不奇怪。所以i在函数创建时不会被冻结,但它是一个实时值。您正在打印i的最后一个已知/设置值。 -
如果我按照您现在编辑的方式运行程序,输出只是一个“3”...
-
我也无法重现第二个示例。请修正缩进并编写完整的代码,以便我们为您提供帮助!
标签: python function closures definition