385105501 发表于 2016-4-1 11:19:05

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

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没有被重新初始化” 这句话,这样做有什么优点?

宋桓公 发表于 2016-4-1 11:19:06

这感觉有点像C里的static关键字修饰的变量——他有局部变量的特性,访问受限制的,但是又有全局变量的特性——生命周期伴随整个程序。

好处就是:
1、安全且生命周期长。
2、外层函数为内层函数服务——简单说,外层函数通过修改配置信息让内层函数得出不同的结果,
本来参数是“并列的关系”,可以修改为“嵌套的关系”
详情请看,我的这个帖子:
我对闭包的几点初步认识

小飞鱼oo 发表于 2016-4-1 15:19:59

个人理解:当a=funX()的时候返回的是一个函数类型的对象   这个函数类型的对象在全局域里每次print()时   是在这个函数类型的对象里赋值执行 此时的funx()只被调用了一次如果当a=funX()再一次赋值这时就相当于在调用函数funx()了 这是所有局部变量全部初始化

小飞鱼oo 发表于 2016-4-1 15:23:05

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

这样做的优点就是可以保护这个x不会初始化 也不会随便被外部所访问 而改变这个变量

jk88 发表于 2016-4-1 17:38:36

呵呵

hushubai 发表于 2016-4-1 20:26:09

看一下

jzh823 发表于 2016-4-3 10:33:56

路过

amogumogu 发表于 2016-4-3 10:48:59

看看咯

amogumogu 发表于 2016-4-3 11:22:33

看看咯

amogumogu 发表于 2016-4-3 11:30:01

啦啦啦啦

helloPY 发表于 2016-4-7 21:22:41

学习了

helloPY 发表于 2016-4-8 19:48:52

不用重复写代码重复引用 直接用a代表一个函数Python的原则简单

小卢 发表于 2016-4-9 21:27:28

也遇到这个问题,谢谢了

will-young 发表于 2017-11-16 22:34:59

为什么我还是没看懂???

骷揖学编程 发表于 2020-4-10 11:35:14

首先a没有重新赋值,函数不会初始化;内嵌函数return了x的值,所以每一次调用函数,x的值会被上一次的运算结果覆盖
页: [1]
查看完整版本: 第二十讲课后第6题 闭包求助