闭包之nonlocal关键字的作用

发布时间 2023-08-26 16:59:23作者: Allen_Hao

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变量,并打印出了修改后的值。这样可以避免意外修改其他变量,提高代码的可读性和可维护性。