鱼C论坛

 找回密码
 立即注册
查看: 1712|回复: 6

[已解决]python 20讲 关于闭包的一些疑问

[复制链接]
发表于 2017-7-29 11:26:47 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 PorcoSh 于 2017-7-29 11:39 编辑

零基础新手  看完20讲闭包  想问问大家我这个理解正确么
看课后习题第6问,
  1. def funX():
  2.     x = 5
  3.     def funY():
  4.         nonlocal x
  5.         x += 1
  6.         return x
  7.     return funY

  8. a = funX()
  9. print(a())
  10. print(a())
  11. print(a())
复制代码


这里输出的是 6,7,8   是不是等于是把 x 赋值 x+1 后 每次在返回到funY()这个函数里?
a 是不是等同于 funY这个返回的函数式名字, 当它加上括号变成 a() 的时候 实际上没有运行funX()这个函数 而运行的是funY()
所以每次运行 a() 是不是从下面这个图开始的,
  1. def funY():
  2.         nonlocal x
  3.         x += 1
  4.         return x
  5.     return funY
复制代码


如果是上面这样  闭包是不是相当于一个存储的功能   
用a来定义母函数    然后a()相当于运行了一次子函数   返回了一个函数名 funY 并且储存了上一次运行a()的参数  当再次运行a()的时候就使用已经储存的参数

搜索了别人的帖子 看到一些没学过的术语 类 对象 实例化 是不是就差不多是我上面这个意思    有不对的地方希望大家指出
最佳答案
2017-7-29 15:03:13
本帖最后由 装辣椒 于 2017-7-29 15:08 编辑

我也是新手,在做这题的时候,也有困惑
你写的我同意一部分

a = funX()  那么, a() = funX()(),也就是说a()这个括号是给y的,是y的参数(就像你写的那个代码图一样)


不过我的理解是,
每print一次,就运行一次funX,内嵌函数funY也跟着运行一次, x +=1,
因为funY()里的x有注明nonlocal x,也就是说funY()里的x它是非局部变量,
所以运行一次后,funX里的x就等于6了,整个代码就变成
  1. def funX():
  2.       x = 6
  3.       def funY():
  4.             nonlocal x
  5.             x += 1
  6.             return x
  7.       return funY

  8. a = funX()
复制代码

print(即运行)两次后,x就等于7

也就是说母函数的x一直在被不断改变,可以这么理解吗

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-29 11:32:32 | 显示全部楼层
你说得对!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-29 11:57:31 | 显示全部楼层
看你的这句话
‘’a 是不是等同于 funY这个返回的函数式名字, 当它加上括号变成 a() 的时候 实际上没有运行funX()这个函数 而运行的是funY()”
a  加() 时也运行funX(),如果不运行funX()里边的内嵌函数怎么运行呢,

关于a加不加()    你仔细看程序运行过程    当运行 return funY  ,返回的是函数名,这样不会调用 funY()函数,在a 后面加()
相当于a()=funX()()=然后返回  funY =funY()     这样才会调用 funY()




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-7-29 12:28:28 | 显示全部楼层
Castieler 发表于 2017-7-29 11:57
看你的这句话
‘’a 是不是等同于 funY这个返回的函数式名字, 当它加上括号变成 a() 的时候 实际上没有运 ...

嗯嗯,多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-29 15:03:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 装辣椒 于 2017-7-29 15:08 编辑

我也是新手,在做这题的时候,也有困惑
你写的我同意一部分

a = funX()  那么, a() = funX()(),也就是说a()这个括号是给y的,是y的参数(就像你写的那个代码图一样)


不过我的理解是,
每print一次,就运行一次funX,内嵌函数funY也跟着运行一次, x +=1,
因为funY()里的x有注明nonlocal x,也就是说funY()里的x它是非局部变量,
所以运行一次后,funX里的x就等于6了,整个代码就变成
  1. def funX():
  2.       x = 6
  3.       def funY():
  4.             nonlocal x
  5.             x += 1
  6.             return x
  7.       return funY

  8. a = funX()
复制代码

print(即运行)两次后,x就等于7

也就是说母函数的x一直在被不断改变,可以这么理解吗

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-29 15:37:45 | 显示全部楼层
装辣椒 发表于 2017-7-29 15:03
我也是新手,在做这题的时候,也有困惑
你写的我同意一部分

懂了,相当于把a看成 一个包含x变量和funY()的函数,然后执行一次a()后,x=6了,在用这个6执行下一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-29 15:41:45 | 显示全部楼层
PorcoSh 发表于 2017-7-29 15:37
懂了,相当于把a看成 一个包含x变量和funY()的函数,然后执行一次a()后,x=6了,在用这个6执行下一次

嗯嗯我是这么理解的,目前只能理解到这一步,不知道对不对
后期碰到其他问题,再慢慢加深吧
感觉a()不是很容易理解,还是看成funx()()比较容易理解吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 17:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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