鱼C论坛

 找回密码
 立即注册
查看: 2708|回复: 8

[已解决]这个闭包函数的答案还是不懂希望有大神可以解答下

[复制链接]
发表于 2016-7-23 19:27:39 | 显示全部楼层 |阅读模式

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

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

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

a = funX()
print(a())
print(a())
print(a())
最佳答案
2016-7-23 19:46:04
首先注意到返回值是funY而不是funY()
所以执行完a = funX(),--->   a=funY
接下来a()其实是在执行funY()
在函数funY()里面写了nonlocal x,使其可以使用外层函数的变量(相当于使其变成了全局变量,我不知道这样说是不是正确),所以开始定义x=5,之后执行+1,x变为6,再把6返回,所以第一次调用print(a())返回的是6

因为x已经被定义为“全局变量”,所以第二次调用的时候x的初始值为6,那么返回的就是7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-23 19:46:04 | 显示全部楼层    本楼为最佳答案   
首先注意到返回值是funY而不是funY()
所以执行完a = funX(),--->   a=funY
接下来a()其实是在执行funY()
在函数funY()里面写了nonlocal x,使其可以使用外层函数的变量(相当于使其变成了全局变量,我不知道这样说是不是正确),所以开始定义x=5,之后执行+1,x变为6,再把6返回,所以第一次调用print(a())返回的是6

因为x已经被定义为“全局变量”,所以第二次调用的时候x的初始值为6,那么返回的就是7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-7-23 19:49:09 | 显示全部楼层
x 就相当于 a 的 私有静态变量

私有,就是外界无法访问它
静态,就是 a 执行完毕,x 还保留有值,不会被当成垃圾回收~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-24 14:03:43 | 显示全部楼层
shuofxz 发表于 2016-7-23 19:46
首先注意到返回值是funY而不是funY()
所以执行完a = funX(),--->   a=funY
接下来a()其实是在执行funY() ...

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

使用道具 举报

 楼主| 发表于 2016-7-24 14:21:26 | 显示全部楼层
SixPy 发表于 2016-7-23 19:49
x 就相当于 a 的 私有静态变量

私有,就是外界无法访问它

只要a没有被重新定义就一直等于函数funY这里我知道
但是闭包函数的nonlocal x 这里不是吧x跟外部函数的x = 5 化成等号了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-24 14:30:26 | 显示全部楼层
就是下雨了 发表于 2016-7-24 14:21
只要a没有被重新定义就一直等于函数funY这里我知道
但是闭包函数的nonlocal x 这里不是吧x跟外部函数的x ...

nonlocal x  只是让后面的 x+=1 不再重新定义 x 。
外层的x 没有被覆盖,闭包就成立了。


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

使用道具 举报

 楼主| 发表于 2016-7-24 16:05:32 | 显示全部楼层
SixPy 发表于 2016-7-24 14:30
nonlocal x  只是让后面的 x+=1 不再重新定义 x 。
外层的x 没有被覆盖,闭包就成立了。

然后第二次print  不是从外部函数x= 5 开始的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-24 16:34:39 | 显示全部楼层
就是下雨了 发表于 2016-7-24 16:05
然后第二次print  不是从外部函数x= 5 开始的吗

x 是变量 不是常量,x的值是可以变的

第一次 执行a() ,x已经变为6了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-24 17:48:23 | 显示全部楼层
SixPy 发表于 2016-7-24 16:34
x 是变量 不是常量,x的值是可以变的

第一次 执行a() ,x已经变为6了

对对对 我一直以为x = 5 是不能变得 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 06:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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