为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Python的非本地关键字不像全局范围一样?

为什么Python的非本地关键字不像全局范围一样?

开心每一天1111 2021-03-15 09:10:08
在Python 3.3.1中,这有效:i = 76def A():    global i    i += 10print(i) # 76A()print(i) # 86这也适用:def enclosing_function():    i = 76    def A():        nonlocal i        i += 10    print(i) # 76    A()    print(i) # 86enclosing_function()但这不起作用:i = 76def A():    nonlocal i # "SyntaxError: no binding for nonlocal 'i' found"    i += 10print(i)A()print(i)nonlocal关键字状态的文档(添加了重点):非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量。在第三个示例中,“最近封闭范围”恰好是全局范围。那为什么不起作用呢?请阅读此位我确实注意到文档继续说明(强调):[ nonlocal]语句允许封装的代码在全局(模块)范围之外的本地范围之外重新绑定变量。但是,严格来说,这并不意味着我在第三个示例中所做的不起作用。
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

名称的搜索顺序为LEGB,即本地,封闭,全局,内置。因此,全局范围不是封闭范围。

编辑

从文档:

非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量。这很重要,因为绑定的默认行为是首先搜索本地名称空间。该语句允许封装的代码在全局(模块)作用域之外的本地作用域之外重新绑定变量。


查看完整回答
反对 回复 2021-03-29
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

答案是全局范围不包含任何内容-它对所有内容都是全局的。global在这种情况下,请使用关键字。


查看完整回答
反对 回复 2021-03-29
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

为什么将模块的作用域视为全局作用域而不是封闭的作用域?它对于其他模块仍然不是全局的(嗯,除非您这样做了from module import *),对吗?

如果您在的名称module空间中添加了一些名称;它在使用的任何模块中都是可见的,module即,它在整个Python过程中都是全局的。

通常,您的应用程序应使用尽可能少的可变全局变量。请参阅为什么全局变量不好?:

  • 非地区性

  • 无访问控制或约束检查

  • 隐式耦合

  • 并发问题

  • 命名空间污染

  • 测试与禁闭

因此,如果nonlocal允许偶然创建全局变量将是不好的。如果要修改全局变量;您可以global直接使用关键字。

  • global 是最具破坏性的:可能会影响程序中模块的所有使用

  • nonlocal 破坏性较小:受external()函数作用域的限制(在编译时检查绑定)

  • 没有声明(局部变量)是破坏性最小的选项:受inner()函数作用域的限制

您可以nonlocal在《PEP:3104访问外部范围中的名称》中了解其背后的历史和动机。


查看完整回答
反对 回复 2021-03-29
  • 3 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信