首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的闭包何时结束执行或超出作用域?

Python中的闭包何时结束执行或超出作用域?
EN

Stack Overflow用户
提问于 2019-05-24 03:05:29
回答 2查看 384关注 0票数 0

我正在试着用闭包来包装我的大脑。我已经看了很多资料,但这个问题主要是基于Wikipedia的解释。

我想我得到了回调作为闭包的想法,用来处理在外部函数发生/调用后发生的事件。我猜这就是Scrapy中的延期发生的事情。我还看过Python中使用日志模块的示例。

好吧,但是,但是,你不能自己调用一个闭包,对吧?因为这将在定义它的范围之外调用它。换句话说,你不能直接调用闭包,你必须调用返回它的封闭函数。但如果是这样的话,闭包的用例就会受到其对外部函数的依赖性的限制。在外部函数停止执行后,它会记住封闭环境的自由变量,这并不意味着闭包是一个可以随身携带和使用的小单元,并且它可以在没有外部函数的情况下工作,对吧?

但如果这是正确的,那么这怎么可能也是正确的:

“...When稍后进入闭包,可能使用不同的词法环境,函数使用其非局部变量执行,引用闭包捕获的变量,而不是当前环境…”维基百科--同样的链接-#(“实现与理论”)

这就是为什么我一直在努力使用闭包的原因。,他们在执行后记住值的想法听起来,至少对我来说,就像它有一个独立于封闭函数的生命,好像你可以在“一个不同的词法环境”中调用或使用它。但如果封闭函数就在那里,那就不是真的了,不是吗?

来自datacamp的这个例子有助于阐明我在一个更简单的例子中发现的令人困惑的地方:

在Python中,函数也被视为对象,这意味着它可以被返回并赋值给变量。在下一个示例中,您将看到不是在outer()内部调用inner(),而是使用return inner。然后,使用字符串参数调用outer()并将其赋值给闭包。现在,即使内部()和外部()函数已经执行完毕,它们的消息仍然被保留。通过调用closure(),可以打印消息。

代码语言:javascript
复制
def outer(message):
    # enclosing function
    def inner():
        # nested function
        print(message)
    return inner


closure = outer("Hello world!")
closure()
Hello world!

请注意,如果调用closure时不带括号,则只返回对象的类型。您可以看到它的类型是函数

代码语言:javascript
复制
__main__.outer.<locals>.inner.closure

<function __main__.outer.<locals>.inner>

现在,即使函数

()和outer()已经执行完毕,它们的消息仍然被保留。

在这个例子中,内部()或外部()在什么意义上“完成了执行”?它们甚至还没有被调用,直到你调用closure()!这里我漏掉了什么?谢谢。

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

https://stackoverflow.com/questions/56281513

复制
相关文章

相似问题

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