nonlocal
和global
是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)
结果:
原因分析: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)
二、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博客