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>

最佳答案

为什么在例1中没有生成闭包,而在例2中有闭包。


因为内部函数不需要外部函数的z


  即使没有Z的闭包,我如何能够从Z的外部函数中获取值


你不能您获得的z是您传递的参数,而不是外部函数的z。 (这就是为什么它是2而不是0的原因。)

关于python - 为什么Z没有关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45552671/

10-16 16:18