鱼C论坛

 找回密码
 立即注册
查看: 1037|回复: 2

[已解决]关于闭包的一个疑惑,请各位老师指点一二

[复制链接]
发表于 2018-1-17 12:44:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 天圆突破 于 2018-1-17 12:52 编辑

昨天学了第20课闭包,又仔细研读了小甲鱼老师发的扩展阅读后,对闭包的概念有了一些了解。事后把扩展阅读里的代码简化了一下,放到vscode里面逐步调试,想看一下闭包的具体执行过程,但是疑惑却更多了。例如下面的代码(扩展阅读简化版,里面的print没有什么意义,就是为了设置检查点而已):
闭包1.png
执行后的结果如下:
闭包2.png
发现,在代码执行过程中,执行11行语句"x = count1()"的时候,程序按照count1函数从上到下的顺序执行了一遍,但是当后面print('第一次赋值:',x(1))开始,只从第6行开始执行。
这里有些疑惑。
(图:使用vs code逐步调试,当13行语句执行后,直接跳转到第6行,忽略了2,3行)
闭包3.png 闭包4.png
python程序不是默认从上到下依次执行么?那为什么在print(x(1))执行的时候会跳过2,3行(外函数)直接执行内涵数的代码呢?
请老师们指点一下。
最佳答案
2018-1-17 12:54:29
1 因为外部函数返回了内部函数的函数名,相当于提供了内部函数的地址,所以你用这个返回值可以直接找到内部函数

2 这和数据的长度有关,每次操作一共占16个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-17 12:54:29 | 显示全部楼层    本楼为最佳答案   
1 因为外部函数返回了内部函数的函数名,相当于提供了内部函数的地址,所以你用这个返回值可以直接找到内部函数

2 这和数据的长度有关,每次操作一共占16个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-17 13:24:24 | 显示全部楼层
①return (count2)是返回函数的结果
   return count2 是调用函数的本身
②x=count2()
   print(x(1))
   print(x(2))
   第一调用count()函数后内部a的值并没有释放
   第二次调用count()函数还会继承上次a的值
   只有当x被重新赋值后才会使count()函数归零重新走一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 23:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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