非局部变量和全局变量有什么区别?

BAE*_*RAM 21 python variables programming-languages global-variables python-nonlocal

我正在学习编程语言的概念。

我在 python 语法中发现了术语“nonlocal”。

python中的nonlocal是什么意思?

小智 26

非局部变量存在于嵌套块中。使用关键字 nonlocal 并获取最近的封闭块中的值。例如:

def outer():
    x = "local"
    
    def inner():
        nonlocal x
        x = "nonlocal"
        print("inner:", x)
    
    inner()
    print("outer:", x)
Run Code Online (Sandbox Code Playgroud)

由于 x 的值已被内部函数更改,因此两次输出都将是“非局部”。


You*_* Hu 17

“非本地”意味着变量“既不是本地的也不是全局的”,即该变量来自封闭的命名空间(通常来自嵌套函数的外部函数)。

非局部和全局之间的一个重要区别是,非局部变量必须已经绑定在封闭的命名空间中(否则将引发语法错误),而局部作用域中的全局声明不需要预先绑定该变量(它将创建如果变量未预先绑定,则全局命名空间中的新绑定)。


小智 13

nonlocal fooininner()可以访问非局部变量foo = 10in middle(),但不能访问非局部变量foo = 5inouter()全局变量foo = 0outside outer(),如下所示:

\n
foo = 0 # <- \xe2\x9c\x96\ndef outer():\n    foo = 5 # <- \xe2\x9c\x96\n    def middle():\n        foo = 10 # <- \xe3\x80\x87\n        def inner():\n            nonlocal foo # Here\n            foo += 1\n            print(foo) # 11\n        inner()\n    middle()\nouter()\n
Run Code Online (Sandbox Code Playgroud)\n

global fooininner()可以访问outside的全局变量foo = 0outer(),但不能访问and中的非局部变量foo = 5,如下所示:outer()middle()

\n
foo = 0 # <- \xe3\x80\x87\ndef outer():\n    foo = 5 # <- \xe2\x9c\x96\n    def middle():\n        foo = 10 # <- \xe2\x9c\x96\n        def inner():\n            global foo # Here\n            foo += 1\n            print(foo) # 1\n        inner()\n    middle()\nouter()\n
Run Code Online (Sandbox Code Playgroud)\n


Jay*_*Lal 6

来自有关非本地语句的文档

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

与全局语句中列出的名称不同,非本地语句中列出的名称必须引用封闭范围内预先存在的绑定(无法明确确定应在其中创建新绑定的范围)。

非本地语句中列出的名称不得与本地范围内预先存在的绑定冲突