1.)为什么没有为例1生成闭包 例如2,有封闭。
2.)示例1即使Z没有闭包我怎么能从Z的外部函数中获取值(因为一旦局部函数作用域结束,所有对象都被基于闭包进行垃圾收集或保留)
示例1
def outer():
x=3
y=4
z=0
def inner(z):
return x,y,z
return inner
i=outer()
i.__closure__
Out[69]:
(<cell at 0x000000000451D738: int object at 0x0000000001D681A8>,
<cell at 0x000000000451D408: int object at 0x0000000001D68190>)
输出
i(2)
Out[78]: (3, 4, 2)
但是当我做的时候
示例2
def outer():
x=3
y=4
z=0
def inner():
return x,y,z
return inner
i=outer()
i.__closure__
Out[72]:
(<cell at 0x000000000451D528: int object at 0x0000000001D681A8>,
<cell at 0x000000000451D3A8: int object at 0x0000000001D68190>,
<cell at 0x000000000451D9A8: int object at 0x0000000001D681F0>
答案 0 :(得分:6)
为什么没有为例1生成闭包,而例如2则有闭包。
因为内部函数不需要外部函数的z
。
即使Z没有闭包,我怎么能从Z的外部函数中获取值
你做不到。你得到的z
是你传递的参数,而不是外部函数的z
。 (这就是为什么它是2而不是0。)