nonlocal
用于子函数修改父函数同名变量情形下,
在函数的内部,我们在构建一个子函数去影响父函数变量的值,这样的行为,就是闭包。
nonlocal
是Python3新增的作用域关键词。
在Python2中,闭包函数可以读取到父函数的变量,但无法修改该变量的值。为此,我们经常要把变量声明为global
全局变量,但这就打破了闭包的性质。
为了解决这个问题,Python3引入了nonlocal
。通过在闭包函数中声明nonlocal
变量,就可以在闭包函数内访问和修改父函数内的同名变量。
代码如下,
def func_a():
x = 5
def func_b():
x = x + 1
print(x)
return
func_b()
print(x)
return
func_a()
程序报错,
原因:在子函数func_b()
中修改了父函数func_a()
同名变量x
的值,但没有声明nonlocal x
。
修改之后的代码如下,
def func_a():
x = 5
def func_b():
nonlocal x
x = x + 1
print(x)
return
func_b()
print(x)
return
func_a()
程序输出为,
6
6