百木园-与人分享,
就是让自己快乐。

闭包第2天

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()

此时结果运行图:

 


来源:https://www.cnblogs.com/isDaHua/p/16678286.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 闭包第2天

相关推荐

  • 暂无文章