首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当python闭包精确地进行捕获时?

当python闭包精确地进行捕获时?
EN

Stack Overflow用户
提问于 2021-08-23 08:37:59
回答 1查看 60关注 0票数 3

下面是python中一个相当不言自明的代码片段:

代码语言:javascript
复制
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,同样的代码片段也能工作:

代码语言:javascript
复制
bar = lambda : free+capture
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-07 05:21:55

在编译时,当python遇到一个函数时,它会进行一些确定。它查看函数中的所有内容,它不创建作用域或命名空间,而是确定哪些变量是本地变量还是非本地变量。

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

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

因此,当外部函数"foo“完成运行时,这个"Cell”对象仍然存在,因此当调用内部函数"bar“时,它仍然得到相同的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68889577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档