为什么Z没有关闭

时间:2017-08-07 17:37:02

标签: python python-2.7

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 个答案:

答案 0 :(得分:6)

  

为什么没有为例1生成闭包,而例如2则有闭包。

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

  

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

你做不到。你得到的z是你传递的参数,而不是外部函数的z。 (这就是为什么它是2而不是0。)