qnt*_*ntm 14 python python-3.x
在Python 3.3.1中,这适用于:
i = 76
def A():
global i
i += 10
print(i) # 76
A()
print(i) # 86
Run Code Online (Sandbox Code Playgroud)
这也有效:
def enclosing_function():
i = 76
def A():
nonlocal i
i += 10
print(i) # 76
A()
print(i) # 86
enclosing_function()
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
i = 76
def A():
nonlocal i # "SyntaxError: no binding for nonlocal 'i' found"
i += 10
print(i)
A()
print(i)
Run Code Online (Sandbox Code Playgroud)
nonlocal关键字状态的文档(强调添加):
非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量.
在第三个例子中,"最近的封闭范围"恰好是全局范围.那为什么不起作用呢?
我注意到文档继续进行状态(强调添加):
除了全局(模块)范围
nonlocal之外,[ ]语句允许封装代码重新绑定局部范围之外的变量.
但是,严格地说,这并不意味着我在第三个例子中所做的事情不应该起作用.
名称的搜索顺序是LEGB,即Local,Enclosing,Global,Builtin.因此全局范围不是封闭范围.
编辑
来自文档:
非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量.这很重要,因为绑定的默认行为是首先搜索本地名称空间.除了全局(模块)范围之外,该语句还允许封装代码重新绑定局部范围之外的变量.
为什么模块的作用域被认为是全局的而不是封闭的?对于其他模块来说它仍然不是全局的(好吧,除非你这样做
from module import *),是吗?
如果你将一些名称放入 的module命名空间中;它在任何使用moduleie 的模块中都是可见的,对于整个 Python 进程来说它是全局的。
一般来说,您的应用程序应该使用尽可能少的可变全局变量。请参阅为什么全局变量不好?:
nonlocal因此,如果允许意外创建全局变量,那将是很糟糕的。如果要修改全局变量;您可以global直接使用关键字。
global最具破坏性:可能会影响程序中任何地方对该模块的所有使用nonlocal破坏性较小:受outer()函数作用域限制(在编译时检查绑定)nonlocal您可以在PEP: 3104 Access to Names in Outer Scopes中了解背后的历史和动机。
| 归档时间: |
|
| 查看次数: |
2657 次 |
| 最近记录: |