nonlocal关键字在闭包中的作用
在Python中,默认情况下,内层函数只能访问外层函数的变量,但不能修改它们。如果希望在闭包函数中修改外层函数中的变量,可以使用nonlocal关键字来声明要修改的变量。
示例
1 # 外部函数 2 def func_out(num1): 3 # 内部函数 4 def func_inner(num2): 5 print("内部函数可以直接访问外部函数的变量,但是无法直接修改外部函数的变量",num1) 6 # 此句会报编译错误 7 # num1 = num1 + num2 8 9 10 11 12 print(num1) 13 func_inner(10) 14 print(num1) 15 16 return func_inner 17 18 19 # 外部函数 20 def func_outV2(num1): 21 # 内部函数 22 def func_inner(num2): 23 nonlocal num1 # 使用nonlocal关键字,内部函数就可以在其内部修改num1的值 24 num1 = num2 + 10 25 26 print(num1) 27 func_inner(10) 28 print(num1) # 内部函数的修改,对外部函数可见 29 30 return func_inner 31 32 num1 = 10 33 f = func_out(10) 34 # 调用闭包 = 内部函数 num2 = 10 35 f(10) 36 37 f = func_outV2(10) 38 # 调用闭包 = 内部函数 num2 = 10 39 f(10)
最佳实践
- 在闭包函数中使用
nonlocal
关键字时,应该避免将其滥用。在不需要修改外层变量的情况下,按照最小化原则,尽量不要使用nonlocal
关键字。 - 当需要在闭包函数中修改外层变量时,确保使用
nonlocal
关键字来明确声明要修改的变量,以避免意外修改其他变量。
1 def outer_function(): 2 x = 0 3 4 def inner_function(): 5 nonlocal x 6 x += 1 7 print(x) 8 9 return inner_function 10 11 closure = outer_function() 12 closure() # Output: 1
在上面的示例中,inner_function
只修改了外层函数中的x
变量,并打印出了修改后的值。这样可以避免意外修改其他变量,提高代码的可读性和可维护性。