gpt4 book ai didi

python - python 闭包什么时候进行捕获?

转载 作者:行者123 更新时间:2023-12-05 04:46:15 25 4
gpt4 key购买 nike

这是一个相当不言自明的 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”和“captured”变量都是自由的。它们不存在于父环境中,也不存在于根目录中。当'bar'从'foo'返回时,'capture'将被捕获。来自堆栈!
所以我假设 python 在函数返回时关闭环境。为什么会这样?为什么不在'bar'的定义时间?如果我们用 lambda 替换 bar,同样的代码片段也可以工作:

bar = lambda : free+capture

最佳答案

在编译时,当python遇到一个函数时,它会做出一些判断。它会查看函数中的所有内容,它不会创建作用域或 namespace ,但会确定哪些变量将是局部变量或非局部变量。

当你运行 foo() 时,这意味着在 foo 的运行时,bar 函数被创建并且 python 将“free”和“capture”确定为非本地,因此 bar 已经有对自由变量的引用。

“free”和“capture”在两个不同的范围内,但始终引用相同的“值”。 python在判断“bar”的局部变量时,会创建一个cell对象。

enter image description here

所以当外部函数“foo”运行结束时,这个“Cell”对象仍然存在,所以当内部函数“bar”被调用时,它仍然得到相同的值。

关于python - python 闭包什么时候进行捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68889577/

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