鱼C论坛

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

第二十讲课后第6题 闭包求助

[复制链接]
发表于 2016-4-1 11:19:05 | 显示全部楼层 |阅读模式
1鱼币
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

如何理解“当a=funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x没有被重新初始化” 这句话,这样做有什么优点?

最佳答案

查看完整内容

这感觉有点像C里的static关键字修饰的变量——他有局部变量的特性,访问受限制的,但是又有全局变量的特性——生命周期伴随整个程序。 好处就是: 1、安全且生命周期长。 2、外层函数为内层函数服务——简单说,外层函数通过修改配置信息让内层函数得出不同的结果, 本来参数是“并列的关系”,可以修改为“嵌套的关系” 详情请看,我的这个帖子: 我对闭包的几点初步认识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-1 11:19:06 | 显示全部楼层
这感觉有点像C里的static关键字修饰的变量——他有局部变量的特性,访问受限制的,但是又有全局变量的特性——生命周期伴随整个程序。

好处就是:
1、安全且生命周期长。
2、外层函数为内层函数服务——简单说,外层函数通过修改配置信息让内层函数得出不同的结果,
本来参数是“并列的关系”,可以修改为“嵌套的关系”
详情请看,我的这个帖子:
我对闭包的几点初步认识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-1 15:19:59 | 显示全部楼层
个人理解:当a=funX()的时候  返回的是一个函数类型的对象   这个函数类型的对象在全局域里  每次print()时     是在这个函数类型的对象里赋值执行 此时的funx()只被调用了一次  如果当a=funX()再一次赋值  这时就相当于在调用函数funx()了 这是所有局部变量全部初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-1 15:23:05 | 显示全部楼层
小飞鱼oo 发表于 2016-4-1 15:19
个人理解:当a=funX()的时候  返回的是一个函数类型的对象   这个函数类型的对象在全局域里  每次print() ...

这样做的优点就是可以保护这个x不会初始化 也不会随便被外部所访问 而改变这个变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-1 17:38:36 | 显示全部楼层
呵呵

评分

参与人数 1鱼币 -10 收起 理由
~风介~ -10 请不要无意义灌水!

查看全部评分

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

使用道具 举报

发表于 2016-4-1 20:26:09 | 显示全部楼层
看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-3 10:33:56 | 显示全部楼层
路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-3 10:48:59 | 显示全部楼层
看看咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-3 11:22:33 | 显示全部楼层
看看咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-3 11:30:01 | 显示全部楼层
啦啦啦啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-7 21:22:41 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-8 19:48:52 | 显示全部楼层
不用重复写代码  重复引用 直接用a代表一个函数  Python的原则  简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-9 21:27:28 | 显示全部楼层
也遇到这个问题,谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-16 22:34:59 | 显示全部楼层
为什么我还是没看懂???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-10 11:35:14 | 显示全部楼层
首先a没有重新赋值,函数不会初始化;内嵌函数return了x的值,所以每一次调用函数,x的值会被上一次的运算结果覆盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 18:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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