鱼C论坛

 找回密码
 立即注册
查看: 3127|回复: 11

[技术交流] 20课的闭包 输出6/7/8的还不算很明白,下面是我个人的理解,希望大家批评指正一下

[复制链接]
发表于 2019-10-7 19:00:10 | 显示全部楼层 |阅读模式

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

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

x
'''
def funX():
    x=5
    print('此时上外面x的值是:',x)
    def funY():
        nonlocal x
        
        x += 1
        print('此时里面x的值是:',x)
        return x
    print('此时下外面x的值是:',x)
    return funY


a = funX()    #调用函数funX,将得到的返回值给t --> a=funY
print('\n',a())#这样不会每次都调用funX()
print('\n',a()) #执行return funY 的part  funY()
print('\n',a())


print('\n',funX()())#每次都从头调用funX()
print('\n',funX()())
print('\n',funX()())
'''



x=5
print('此时上外面x的值是:',x)
def funY():
      
    global x
    print('\n hello',x)
    x += 1
    print('此时里面x的值是:',x)
    return x

print('此时下外面x的值是:',x)

a=funY
print(a())
print(a())
print(a())
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-7 19:01:31 | 显示全部楼层
想了很多操作,还是有点懵懵懂懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-7 19:02:28 | 显示全部楼层
5号猛男 发表于 2019-10-7 19:01
想了很多操作,还是有点懵懵懂懂

你是什么不懂?我看了你的理解,基本是对的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-7 19:08:26 | 显示全部楼层
zltzlt 发表于 2019-10-7 19:02
你是什么不懂?我看了你的理解,基本是对的

我利用输出来看程序的执行顺序,不懂为什么“只要a变量没有被重新赋值,funx()就不会被释放局部变量x就不会重新初始化”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-7 19:09:20 | 显示全部楼层
5号猛男 发表于 2019-10-7 19:08
我利用输出来看程序的执行顺序,不懂为什么“只要a变量没有被重新赋值,funx()就不会被释放局部变量x就 ...

执行 a 时不会重复执行 funX,所以导致 x 一直没有被初始化。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-7 19:11:22 | 显示全部楼层
zltzlt 发表于 2019-10-7 19:09
执行 a 时不会重复执行 funX,所以导致 x 一直没有被初始化。

就是不明白为啥  执行 a 时不会重复执行 funX
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-7 19:12:23 | 显示全部楼层
5号猛男 发表于 2019-10-7 19:11
就是不明白为啥  执行 a 时不会重复执行 funX

执行 a 就是单纯地执行 funX 的返回值 funY
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-7 19:13:28 | 显示全部楼层
zltzlt 发表于 2019-10-7 19:12
执行 a 就是单纯地执行 funX 的返回值 funY

可是第一次的print(a)的是从头执行到尾的对吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-7 19:16:13 | 显示全部楼层
5号猛男 发表于 2019-10-7 19:13
可是第一次的print(a)的是从头执行到尾的对吧?

print(a()) 只是打印 funY 执行的结果。

你问的是不是这个意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-7 19:21:50 | 显示全部楼层
zltzlt 发表于 2019-10-7 19:16
print(a()) 只是打印 funY 执行的结果。

你问的是不是这个意思?

是的
我的理解是后面两个print(a()) 是打印 funY 执行的结果。
第一个print(a()) 是funX 执行的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-7 19:29:31 | 显示全部楼层
5号猛男 发表于 2019-10-7 19:21
是的
我的理解是后面两个print(a()) 是打印 funY 执行的结果。
第一个print(a()) 是funX 执行的结果

a = funX() 就已经调用了一遍 funX,之后没有执行过 funX() 所以 x 变量就没有被初始化。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-7 19:44:51 | 显示全部楼层
zltzlt 发表于 2019-10-7 19:29
a = funX() 就已经调用了一遍 funX,之后没有执行过 funX() 所以 x 变量就没有被初始化。

!懂了,非常谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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