首页 > 其他分享 >闭包之nonlocal关键字的作用

闭包之nonlocal关键字的作用

时间:2023-08-26 17:00:38浏览次数:40  
标签:闭包 10 函数 nonlocal 关键字 inner func num1

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

标签:闭包,10,函数,nonlocal,关键字,inner,func,num1
From: https://www.cnblogs.com/allenxx/p/17659101.html

相关文章

  • [转]C++使用虚函数的时候,子类也要使用virtual关键字吗
    原文地址:https://blog.csdn.net/gao1440156051/article/details/45670715父类使用虚函数是为了让子类重写,那子类重写的时候也需要带virtual关键字吗?比如:classBase{virtualboolinit();};classDerived{virtualboolinit();//这里的vitual是必须的吗?好像不用也能编译通过呃…......
  • Java中static关键字
    叙述:static关键字是很多朋友在编写和阅读代码时比较难理解的一个关键字,但也是面试尤其笔试的考点。下面就从static关键字的用途常见面试题两个方面来描述以下我对static关键字的理解原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html一.static关键字用途在《......
  • Python:过滤包含关键字的行
    PythonPandas:根据指定的关键字,过滤(提取)包含该关键字的行,并保存为Excel文件。importpandasaspdimportnumpyasnpinFile=r'D:\教学任务列表(理论课).xlsx'outFile=r'D:\教学任务(统计).xlsx'df1=pd.read_excel(inFile,header=1)type(df1)df1.head()df1.col......
  • java封装、this关键字
    一,封装1,概述-指的就是把对象的属性细节隐藏起来,外部通过共有的方式来访问。2,好处-提高了代码复用性-提高了安全性3,原则-把不需要对外提供的内容都隐藏起来,根据需求提供对应的共有的访问方式。packagecom.momo.demo;/*我们在使用这个案例的过程中,发现了问题:通过对象给成员变量赋值......
  • iOS开发Swift-闭包
    1.闭包表达式语法{(参数)->return类型in//内容}letnames=["C","A","E","B","D"]funcback(_s1:String,s2:String)->Bool{returns1>s2//(B>A,C>B)}//闭包后:varreversedN......
  • vue-this关键字
    vue中,在script中调用属性和方法,需要使用this在template使用属性、方法,可以省略this:因为vue在解析template时使用了with(this),改变了template中的顶层作用域......
  • js闭包
    一,闭包是什么闭包是:函数内部和函数外部连接的桥梁;可以读取其他函数内变量的函数;可以访问外部函数的变量,并将这些变量保存在内存中,供内部函数在外部函数执行完毕后继续使用;常被用于工厂函数、模块化等场景。二,闭包优缺优点:①保护函数内的变量安全,实现封装,防止变量流入其他环境发......
  • solidity: view和pure关键字
    Solidity中的 pure 和 view 是函数修饰符关键字,用于声明函数的属性和行为。它们的作用如下:pure 关键字:用于声明函数是纯函数,即函数不读取或修改合约的状态变量,并且不与外部合约进行交互。纯函数只根据输入参数计算结果,并返回一个值。纯函数不会改变合约状态,也不会发送......
  • 软件测试 | Java中的关键字
    Java中也有许多关键字(也叫保留字),如public、static等,这些关键字不能当做标识符使用。表2-1列出了Java中的关键字,这些关键字并不需要去硬背,因为在程序开发中一旦使用了这些关键字做标识符时,编辑器会自动提示错误。对于以上的关键字,要特别注意的有如下3点:(1)虽然goto、const在Java中并没......
  • type关键字
    1.类型别名作用:类型别名用来给一个类型起个新名字。type关键字用法如下:typeName=string;typeNameResolver=()=>string;typeNameOrResolver=Name|NameResolver;functiongetName(n:NameOrResolver):Name{if(typeofn==='string'){return......