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

在Python 3.3.1中,这有效:


i = 76


def A():

    global i

    i += 10


print(i) # 76

A()

print(i) # 86

这也适用:


def enclosing_function():

    i = 76

    def A():

        nonlocal i

        i += 10


    print(i) # 76

    A()

    print(i) # 86


enclosing_function()

但这不起作用:


i = 76

def A():

    nonlocal i # "SyntaxError: no binding for nonlocal 'i' found"

    i += 10


print(i)

A()

print(i)

nonlocal关键字状态的文档(添加了重点):

非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量。

在第三个示例中,“最近封闭范围”恰好是全局范围。那为什么不起作用呢?

请阅读此位

我确实注意到文档继续说明(强调):

nonlocal]语句允许封装的代码在全局(模块)范围之外的本地范围之外重新绑定变量。

但是,严格来说,这并不意味着我在第三个示例中所做的不起作用。


开心每一天1111
浏览 189回答 3
3回答

Smart猫小萌

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

一只甜甜圈

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

慕无忌1623718

为什么将模块的作用域视为全局作用域而不是封闭的作用域?它对于其他模块仍然不是全局的(嗯,除非您这样做了from module import *),对吗?如果您在的名称module空间中添加了一些名称;它在使用的任何模块中都是可见的,module即,它在整个Python过程中都是全局的。通常,您的应用程序应使用尽可能少的可变全局变量。请参阅为什么全局变量不好?:非地区性无访问控制或约束检查隐式耦合并发问题命名空间污染测试与禁闭因此,如果nonlocal允许偶然创建全局变量将是不好的。如果要修改全局变量;您可以global直接使用关键字。global 是最具破坏性的:可能会影响程序中模块的所有使用nonlocal 破坏性较小:受external()函数作用域的限制(在编译时检查绑定)没有声明(局部变量)是破坏性最小的选项:受inner()函数作用域的限制您可以nonlocal在《PEP:3104访问外部范围中的名称》中了解其背后的历史和动机。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python