鱼C论坛

 找回密码
 立即注册
查看: 2673|回复: 5

关于闭包的一个问题 求助~~~~~

[复制链接]
发表于 2016-1-4 17:01:16 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 碗碗的泡菜坛 于 2016-1-4 17:06 编辑

闭包疑问.png

看了小甲鱼的解释还是不明白
求更加直白的解释哇~~

最佳答案

查看完整内容

如果不是闭包,每次执行funy都要先执行funx,即x总会先变成5,而闭包只在a=funx()时执行funx,再调用a()时就直接执行funy了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-4 17:01:17 | 显示全部楼层
如果不是闭包,每次执行funy都要先执行funx,即x总会先变成5,而闭包只在a=funx()时执行funx,再调用a()时就直接执行funy了。
  1. >>> def funX():
  2.         x = 5
  3.         def funY():
  4.                 nonlocal x
  5.                 x += 1
  6.                 return x
  7.         return funY

  8. >>> a = funX()#调用funX
  9. >>> print(a())#只调用funY
  10. 6
  11. >>> print(a())#只调用funY
  12. 7
  13. >>> print(a())#只调用funY
  14. 8
  15. >>> a = funX()#再次调用funX,x又变成了5
  16. >>> print(a())#只调用funY
  17. 6
  18. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-4 17:21:52 | 显示全部楼层
本帖最后由 paomaliuju 于 2016-1-4 17:31 编辑

被nonlocal关键字修饰的变量,表示使用外层的,且不是全局的变量。
在本例中,funX函数返回的是它内部的一个函数funY,a接受了funY这个函数对象。所以,a()第一次调用时,x=5,执行x += 1后,就是6了;第二次调用后就是7了,以此类推
注:本例中,funX函数只调用了一次,a()执行了三次,实际上可以看做是funY被调用了三次。整个过程中,x是funX函数的局部变量,而funX只调用了一次,所以x并没有初始化。

评分

参与人数 2荣誉 +10 鱼币 +10 收起 理由
碗碗的泡菜坛 + 5 + 5 感谢楼主无私奉献!
冬雪雪冬 + 5 + 5 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-4 17:29:12 | 显示全部楼层
使用闭包之所以稳定安全是因为调用内嵌函数的同时不影响外部函数的变量值,这样说合理吗?那么这样的话如果从保护变量值的角度去考虑,那闭包的作用真的非常重要了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-4 17:50:29 | 显示全部楼层
paomaliuju 发表于 2016-1-4 17:21
被nonlocal关键字修饰的变量,表示使用外层的,且不是全局的变量。
在本例中,funX函数返回的是它内部的一 ...

FunY被调用了三次,FunY每一次调用,第一步都是引用上一层的变量x = 5...为什么实际上第二次第三次都直接跳过x = 5 ,对x进行了累加呢???还是不太明白呀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-5 15:08:19 | 显示全部楼层
本帖最后由 paomaliuju 于 2016-1-5 15:12 编辑
碗碗的泡菜坛 发表于 2016-1-4 17:50
FunY被调用了三次,FunY每一次调用,第一步都是引用上一层的变量x = 5...为什么实际上第二次第三次都直接 ...


nonlocal x,x引用的是funx函数当中的x,你不断地执行a(),即调用funy函数,每调用一次funy,x就增加1,注意此时x依旧是funx函数当中的x(也就是说,你虽然执行的是funy函数,但是却改变了funx函数当中的局部变量)。当退出程序或重新调用funx函数时(其实是在内存中重新生成了一个函数对象),这时x的初始值还是5
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-19 02:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表