【发布时间】:2021-12-14 03:27:34
【问题描述】:
以下代码吐出两次1,但我希望看到0,然后是1。
def pv(v) :
print v
x = []
for v in range(2):
x.append(lambda : pv(v))
for xx in x:
xx()
我希望 python lambdas 在幕后绑定到局部变量指向的引用。然而,情况似乎并非如此。我在一个大型系统中遇到了这个问题,其中 lambda 正在执行现代 C++ 的等效绑定(例如,'boost::bind'),在这种情况下,您将绑定到智能 ptr 或复制构造 lambda 的副本。
那么,如何将局部变量绑定到 lambda 函数并让它在使用时保留正确的引用?我对这种行为感到非常惊讶,因为我不希望有垃圾收集器的语言会出现这种情况。
【问题讨论】:
-
我见过这个问题的几个变种。有人需要汇总所有这些,将标题更改为令人难忘的内容,然后告诉互联网谷歌
-
啊,给你,几乎是重复的:lexical-closures-in-python
-
@shep,是的,我无法正确表达它,我试图复制 lua 的工作方式。
-
Python 的奇怪之处在于循环变量在循环之后仍然存在,因此在循环内定义并引用循环变量的函数在循环外调用时不会抛出
NameError。在大多数其他语言中,循环变量只能在循环本身内访问。