本帖最后由 白two 于 2021-8-28 10:45 编辑
funY 哪来的值呢?他只是一个函数罢了
可以这么理解,但我感觉它的机制像是重新给 a 开辟了一块内存来存储 funY 的逻辑:
- def funX():
- x = 5
- def funY():
- nonlocal x
- x += 1
- return x
- return funY
- print(id(funX))
- a = funX
- print(id(a))
- b = funX()
- c = funX()
- print(funX())
- print(b)
- print(c)
- print(id(b))
- print(id(c))
- print(b())
- print(b())
- print(c())
复制代码
结果:
- 1363293958208
- 1363293958208
- <function funX.<locals>.funY at 0x0000013D6B18A3A0>
- <function funX.<locals>.funY at 0x0000013D6B188E50>
- <function funX.<locals>.funY at 0x0000013D6B18A310>
- 1363301404240
- 1363301409552
- 6
- 7
- 6
复制代码
你看,三个函数
funx(),b,c,全是
function funX.<locals>.funY 对象,只是地址不一样罢了,
你看如果直接 a = funX 的话,就是 a 指向 funX 的内存,调用 a 改的 x 是啥值, funX 的 x 就是啥值
但是闭包的话就相当于再开了一块内存,但是函数依然是 funY ,所以 x 初始值依然是 5,但 b,c的内存地址不一样,所以它俩互不影响,但是你是直接三次调用 a 啊