下面是python中一个相当不言自明的代码片段:
globl = 1
def foo():
def bar():
return free+capture
capture = globl #not seen, when bar is defined
return bar
free = 2
a = foo()
globl = 4
b = foo()
print(a()) #3
print(b()) #6
print(a.__closure__[0].cell_contents) # 1
print(b.__closure__[0].cell_contents) # 4 定义“bar”时,“free”和“捕获”变量都是空闲的。它们既不存在于母体环境中,也不存在于根中。当“foo”返回“bar”时,将捕获“capture”。从一堆!
因此,我假设python在返回函数时会关闭环境。为什么是这种情况?为什么不在“酒吧”的定义时间?如果我们用lambda替换bar,同样的代码片段也能工作:
bar = lambda : free+capture发布于 2021-09-07 05:21:55
在编译时,当python遇到一个函数时,它会进行一些确定。它查看函数中的所有内容,它不创建作用域或命名空间,而是确定哪些变量是本地变量还是非本地变量。
当您运行foo() (这意味着在foo的运行时),bar函数将被创建,并且python将“空闲”和“捕获”确定为非本地的,因此bar已经有了对空闲变量的引用。
"free“和"capture”在两个不同的范围内,但始终引用相同的“值”。当python确定"bar“的局部变量时,它会创建一个cell对象。

因此,当外部函数"foo“完成运行时,这个"Cell”对象仍然存在,因此当调用内部函数"bar“时,它仍然得到相同的值。
https://stackoverflow.com/questions/68889577
复制相似问题