ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

闭包第2天

2022-09-10 21:31:31  阅读:192  来源: 互联网

标签:闭包 10 num1 inner func 函数


2022-09-10

闭包的使用实例

 1 def config_name(name):
 2     def inner(msg):
 3         print(name + ":" + msg)
 4 
 5     print(id(inner))
 6     return inner
 7 
 8 A = config_name("A")
 9 B = config_name("B")
10 A ("有朋自远方来,不亦乐乎。")
11 B ("都说我如水百变,可知我清澈不变。")
12 
13 # 闭包可以对外部函数的变量和参数进行保存

结果图:

代码说明:

  (1)首先创建了一个闭包函数,即函数嵌套函数,而且在内部函数中使用了外部函数的参数name,在外部函数中的代码中返回内部函数,注意此处的内部函数返回值与常规调用不同,尽管内部函数是个有参函数,但是此时返回的是一个内部函数的名称。

♣在闭包函数的定义中,我不太理解为什么内部函数是一个有参函数,但是返回值时,只是一个单独的函数名称,为什么不要括号了呢?

☆后来我想了一下,可以这样理解,在外部函数中创建的内部函数相当于外部函数的一个变量,因此返回时,可以直接返回内部函数的名称。

  (2)创建好闭包函数后,创建闭包实例对象进行测试。调用闭包函数,而且传一个实参给name,后赋值给一个变量A。因为在闭包函数中还有一个内部函数需要传参,因此在变量A后直接加括号,在括号内写入要传入的实参。B变量同理。

 结果图解释:

(1)第一行与第二行表示的是闭包中的内部函数的内存地址,可以看出创建的两个闭包实例对象的内部函数的存放位置不是相同的。

(2)第三行与第四行输出的是第3行代码输出的内容。


 

闭包使用中的注意事项:

  修改闭包内使用的外部变量

先看一个例图:

 1 def func_out():
 2     num1 = 10
 3     def func_inner():
 4         num1 = 20
 5         result = num1 + 10
 6         print(result)
 7     print("修改前的num1:",num1)
 8     func_inner()
 9     print("修改后的num1:",num1)
10     return func_inner
11 
12 new_func = func_out()
13 new_func()

此时的输出结果:

 

  可以看出在代码的第4中修改了变量num1的值,但是查看结果图中“修改后的num1”的值仍然是10.可以看出这样并没有改变变量。因为这里是在内部函数定义了一个局部变量,只是它的名称与外部变量的值相等而已。所以在外部输出“修改后的num1”的值仍然是外部变量为10。

 

♣那么使用全局变量修饰符“global”呢,修改后的值会不会变呢?

  ☆使用Python解释器pycharm验证后,值仍然还是不会变。为什么此处全局变量修饰符不起作用呢?可能闭包中的内部函数修改外部变量的值,不支持“gloabl”,不支持这种语法吧。其他的也不知道。

 

所以想要在闭包中的内部函数中修改外部变量时,要使用什么呢?

  使用关键字“nonlocal”。nonloacl是专门用于表名外部嵌套函数内的变量。

so,若需要实现修改闭包内使用的外部变量的需求,上述的代码可改为:

 1 def func_out():
 2     num1 = 10
 3     def func_inner():
 4         nonlocal num1 
 5         num1 = 20
 6         result = num1 + 10
 7         print(result)
 8     print("修改前的num1:",num1)
 9     func_inner()
10     print("修改后的num1:",num1)
11     return func_inner
12 
13 new_func = func_out()
14 new_func()

此时结果运行图:

 

标签:闭包,10,num1,inner,func,函数
来源: https://www.cnblogs.com/isDaHua/p/16678286.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有