nonlocal 关键字用于在内嵌函数中引用并修改外层(但不是全局)作用域中的变量。这意味着通过 nonlocal,你可以修改外层函数的局部变量,而不是创建一个新的局部变量。
注意如果不修改外层函数变量的值是用不到nonlocal的。
解释你的代码:
def closure_func(num):
var = num + 3 # 外层函数的局部变量
def inner():
nonlocal var # 声明 var 是外层函数的局部变量
print("在inner()内部之前, var = {}".format(var)) # 打印 var 的初始值
var = 2 # 修改外层函数的 var,注意如果不修改外层函数变量的值是用不到nonlocal var的。
print("在inner()内部之后, var = {}".format(var)) # 打印修改后的 var
return inner
代码分析:
外层函数:closure_func(num) 定义了一个局部变量 var,它是 num + 3。
内层函数:inner() 在内部通过 nonlocal 声明 var 变量,这意味着它指向的是外层函数 closure_func 中的 var 变量,而不是在 inner() 内部创建一个新的局部变量。
修改:在 inner() 中,var 的初始值会先被打印出来,然后 var 被设置为 2,这修改了外层函数中的 var。
返回:closure_func 返回 inner 函数,inner 函数成为一个闭包,能够访问并修改外层函数的 var 变量。
代码执行过程:
假设 closure_func(5) 被调用,执行过程如下:
closure = closure_func(5)
closure()
closure_func(5) 被调用,num 为 5,因此 var 被初始化为 5 + 3 = 8。
然后返回 inner 函数,并将其赋值给 closure。
当执行 closure() 时,进入 inner() 函数:
nonlocal var 声明 var 是外层函数中的变量 var。
print("在inner()内部之前, var = 8") 打印 var 的当前值,即 8。
然后 var = 2 修改了外层函数中的 var 值为 2。
最后,print("在inner()内部之后, var = 2") 打印修改后的 var,即 2。
输出:
在inner()内部之前, var = 8
在inner()内部之后, var = 2
nonlocal 的作用:
避免创建新局部变量:nonlocal 允许你在内层函数中修改外层函数的变量,而不是创建一个新的局部变量。
作用范围:nonlocal 是针对外层函数中的局部变量的,而不是全局变量。如果你想修改全局变量,应该使用 global。
闭包:在 Python 中,闭包函数能够“记住”外层函数的变量,即使外层函数已经执行完毕。nonlocal 可以帮助在闭包中修改这些变量。
总结:
nonlocal 关键字用于引用并修改外层函数中的变量,避免创建新的局部变量。
这个关键字通常用于闭包场景,帮助内层函数访问和修改外层函数的局部变量。