返回介绍

nonlocal 应用

发布于 2024-01-29 22:24:16 字数 1472 浏览 0 评论 0 收藏 0

这些例子都在Python 3.0中运行。对嵌套的def作用域的引用像在Python 2.6中一样工作。在下面的代码中,tester构建并返回函数nested以便随后调用,nested中的state引用使用超常规的作用域查找规则来映射tester的本地作用域:

默认情况下,不允许修改嵌套的def作用域中的名称;这也是Python 2.6的一般情况:

使用nonlocal进行修改

现在,在Python 3.0下,如果我们在nested中把tester作用域中的state声明为一个nonlocal,我们就可以在nested函数中修改它了。即便我们通过名称F调用返回的nested函数时,tester已经返回并退出了,这也是有效的:

通常使用嵌套作用域引用时,我们可以多次调用tester工厂函数,以便在内存中获得其状态的多个副本。嵌套作用域中的state对象基本上附加到了返回的nested函数对象,每次调用都产生一个新的、独特的state对象,以至于更新一个函数的state不会影响到其他的。如下代码继续前面的交互式程序:

边界情况

有几件事情需要注意。首先,和global语句不同,当执行一条nonlocal语句时,nonlocal名称必须已经在一个嵌套的def作用域中赋值过,否则将会得到一个错误——不能通过在嵌套的作用域中赋给它们一个新值来创建它们:

其次,nonlocal限制作用域查找仅为嵌套的def,nonlocal不会在嵌套的模块的全局作用域或所有def之外的内置作用域中查找,即便已经有了这些作用域:

一旦你意识到Python不能普遍地知道在哪个嵌套的作用域中创建一个全新的名称,这些限制就有意义了。在前面的程序中,spam应该在tester中赋值,还是在模块之外赋值?由于这不明确,Python必须在函数创建的时候解析nonlocal,而不是在函数调用的时候。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文