在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,即本地,封闭,全局,内置。因此,全局范围不是封闭范围。
编辑
从文档:
非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量。这很重要,因为绑定的默认行为是首先搜索本地名称空间。该语句允许封装的代码在全局(模块)作用域之外的本地作用域之外重新绑定变量。
慕无忌1623718
TA贡献1744条经验 获得超4个赞
为什么将模块的作用域视为全局作用域而不是封闭的作用域?它对于其他模块仍然不是全局的(嗯,除非您这样做了
from module import *
),对吗?
如果您在的名称module
空间中添加了一些名称;它在使用的任何模块中都是可见的,module
即,它在整个Python过程中都是全局的。
通常,您的应用程序应使用尽可能少的可变全局变量。请参阅为什么全局变量不好?:
非地区性
无访问控制或约束检查
隐式耦合
并发问题
命名空间污染
测试与禁闭
因此,如果nonlocal
允许偶然创建全局变量将是不好的。如果要修改全局变量;您可以global
直接使用关键字。
global
是最具破坏性的:可能会影响程序中模块的所有使用nonlocal
破坏性较小:受external()函数作用域的限制(在编译时检查绑定)没有声明(局部变量)是破坏性最小的选项:受inner()函数作用域的限制
您可以nonlocal
在《PEP:3104访问外部范围中的名称》中了解其背后的历史和动机。
添加回答
举报
0/150
提交
取消