鱼C论坛

 找回密码
 立即注册
查看: 2069|回复: 14

[已解决]20讲闭包例子

[复制链接]
发表于 2020-7-26 12:32:49 | 显示全部楼层 |阅读模式

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

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

x
def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY

a = funX()
print(a())
print(a())
print(a())
各位鱼友,为什么是输出的结果是6,7,8看老师的答案也看不明白。
最佳答案
2020-7-26 14:45:49
今天又起雾了 发表于 2020-7-26 14:41
大佬刚才看懵了。我想问的是第一次打印的时候,引用非全局变量x = 5  所以 return x = x + 1 =6  返回的 ...



这个部分你好好体会,你调用完 FunX 之后的作用空间:

Snipaste_2020-07-26_14-45-01.png


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

使用道具 举报

发表于 2020-7-26 12:43:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-26 12:58:31 | 显示全部楼层
本帖最后由 Twilight6 于 2020-7-26 13:37 编辑


善用论坛的搜索功能哈:https://fishc.com.cn/forum.php?m ... 822&pid=4777716

def funX():
    x = 5

    def funY():
        nonlocal x
        x += 1
        return x

    return funY

a = funX()


当你调用 a = funX() 时候,返回的是 funY  而你 funX() 函数设置的返回值就是 funY 这里没带括号,是返回的一整个函数体,也就是 funY函数

所以这里实际上你一调用完 funX() 时候a就等于了 funY,即 a = funY (没带括号,是指这个函数),这个时候 x 相对于  a 来说是个全局变量,也就是函数可以看成是这样的:

def funY():
        nonlocal x
        x += 1
x = 5
a = funY


而你每次 a() 都是等于调用了一次 funY() 导致每次调用 x 都 + 1 ,所以每次调用 a() 的值都是不一样的

你要记着,当函数名带上括号就是调用这个函数,返回的是函数运行的结果

而只有函数名时候,相当于是把这个函数赋值给了一个变量,这个变量就是这个函数的 别名

当你调用这个变量时候,实际上就是在调用赋值的函数体本身,所以你最终打印的结果是 6、7、8

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

使用道具 举报

 楼主| 发表于 2020-7-26 14:16:42 | 显示全部楼层
Twilight6 发表于 2020-7-26 12:58
善用论坛的搜索功能哈:https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=172822&pid=47 ...

大佬,看了半天也不是很清楚,a = funX() 就等于a = funY,  a()  = 调用funY函数体。第一次打印,用x = 5的非全局变量。第二次打印的时候,这个引用x=6 这个非全局变量怎么给他赋值的?
def funY():
        nonlocal x
        x += 1
        return x

    return funY
如果没有x=5 的非全局变量。nonlocal x 这句咋办呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-26 14:20:13 | 显示全部楼层
今天又起雾了 发表于 2020-7-26 14:16
大佬,看了半天也不是很清楚,a = funX() 就等于a = funY,  a()  = 调用funY函数体。第一次打印,用x = 5 ...



a = funX() 就等于a = funY


就是因为 funX() 函数带上括号就是返回函数里面设置的 return 的值

即是 funY , 所以 a = funX() = funY

如果没有x=5 的非全局变量。nonlocal x 这句咋办呢


x += 1 就是 x = x + 1 而如果没有 x 肯定报错,因为没有 x 这个变量就不能 x += 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-26 14:41:12 | 显示全部楼层
Twilight6 发表于 2020-7-26 14:20
就是因为 funX() 函数带上括号就是返回函数里面设置的 return 的值

即是 funY , 所以 a = fu ...

大佬刚才看懵了。我想问的是第一次打印的时候,引用非全局变量x = 5  所以 return x = x + 1 =6  返回的结果是6。
第二次打印的时候呢,第二次引用
def funX():
    x = 6 -------------------------这个地方变成了6了么,怎么变的
    def funY():
        nonlocal x
        x += 1
        return x------------------------------还是这是6------给了funY()吗怎么赋值的呢
    return funY
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-26 14:45:49 | 显示全部楼层    本楼为最佳答案   
今天又起雾了 发表于 2020-7-26 14:41
大佬刚才看懵了。我想问的是第一次打印的时候,引用非全局变量x = 5  所以 return x = x + 1 =6  返回的 ...



这个部分你好好体会,你调用完 FunX 之后的作用空间:

Snipaste_2020-07-26_14-45-01.png


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

使用道具 举报

 楼主| 发表于 2020-7-26 15:00:48 | 显示全部楼层
Twilight6 发表于 2020-7-26 14:45
这个部分你好好体会,你调用完 FunX 之后的作用空间:

大佬,对不起,我还是不明白,能帮我写一下 print(a()) = 7的代码长什么样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-26 15:07:10 | 显示全部楼层
Twilight6 发表于 2020-7-26 14:45
这个部分你好好体会,你调用完 FunX 之后的作用空间:

谢谢大佬我好想明白了。。。。。感觉自己好傻

点评

不会的,学习嘛,都有个过程~  发表于 2020-7-26 16:12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-26 16:31:41 | 显示全部楼层
今天又起雾了 发表于 2020-7-26 15:07
谢谢大佬我好想明白了。。。。。感觉自己好傻

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

使用道具 举报

发表于 2020-11-7 20:54:31 | 显示全部楼层
Twilight6 发表于 2020-7-26 14:45
这个部分你好好体会,你调用完 FunX 之后的作用空间:

函数体是什么意思啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 20:56:08 | 显示全部楼层
Self123 发表于 2020-11-7 20:54
函数体是什么意思啊?


一个函数的整体
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 21:30:09 | 显示全部楼层

大佬那为什么,funX里前面的X=5不再次运行了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 21:33:14 | 显示全部楼层
Self123 发表于 2020-11-7 21:30
大佬那为什么,funX里前面的X=5不再次运行了?


代码只会往后运行,不会往前

因为 funX() 函数返回的是 funY ,所以后续你运行的函数是 funY ,而 funY 函数改变的是原先的 x 的值(即 x += 1)

只有你重新你运行 funX 时候 才会重新运行 x = 5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 12:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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