闭包之nonlocal关键字的作用

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

posted @   Allen_Hao  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示