Python的nonlocal与global关键字

nonlocalglobal是Python中用于在函数内部访问外部作用域变量的关键字。

一、nonlocal关键字

nonlocal用于在嵌套函数中修改外部函数的局部变量。当在一个函数内部定义了另一个函数,并且内部函数想要修改外部函数的局部变量时,可以使用nonlocal关键字。

示例代码:

def outer():
    x = 10

    def inner():
        nonlocal x
        x = 20

    inner()
    print(x)  # 输出:20

outer()

在上述代码中,inner()函数位于outer()函数内部,并且想要修改outer()函数中的局部变量x。通过使用nonlocal关键字,内部函数可以访问并修改外部函数的局部变量。

nonlocal关键字只能作用域局部变量,且始终找离当前最近的上层局部作用域中的变量。

a = 1
def outer():
    nonlocal a
    a = 2
outer()
print(a)

结果:

Python的nonlocal与global关键字_第1张图片

 原因分析:nonlocal关键字是能作用域局部变量,当使用nonlocal声明变量 a 时,就会往上最近一层局部作用域寻找局部变量 a ,结果没找着,报错。

a = 1
def outer():
    global a
    a = 2
    def inner():
        nonlocal a
        a = 3
    inner()
    print(a)
outer()
print(a)

结果:报错  SyntaxError: no binding for nonlocal 'a' found,

原因分析:当使用nonlocal声明变量 a 时,就会往上最近一层局部作用域寻找局部变量 a ,此时外层局部作用域虽然能找到变量a,但是这找到的 这个a 已经被global声明为全局变量了,所以报错。

a = 1
def outer(): 
    a = 2
    def inner():
        nonlocal a
        a = 3
        def inner2():
            print(a)
        inner2()
        print(a)
    inner()
    print(a)
outer()
print(a)

Python的nonlocal与global关键字_第2张图片

二、global关键字

global用于在函数内部访问和修改全局变量。当在函数内部想要修改全局变量的值时,可以使用global关键字。

示例代码:

x = 10

def modify_global():
    global x
    x = 20

modify_global()
print(x)  # 输出:20

在上述代码中,modify_global()函数想要修改全局变量x的值。通过使用global关键字,函数内部可以访问并修改全局变量。

三、总结

  • nonlocal关键字用于在嵌套函数中访问和修改外部函数的局部变量。
  • global关键字用于在函数内部访问和修改全局变量。

需要注意的是,使用 nonlocal 和 global 关键字时,要确保在使用之前已经有对应的变量存在。否则,会引发 NameError 异常。此外,过度使用 global 和 nonlocal 可能会导致代码可读性和维护性的下降,因此应谨慎使用,并优先考虑使用函数参数和返回值来进行变量传递和修改。

参考:

python 函数嵌套和nonlocal关键字_只待风起的博客-CSDN博客

你可能感兴趣的:(python,python,开发语言)