关于python闭包的问题:为什么代码在函数中保留局部变量的值?



在我看来,在闭包中,我们可以引用超出其自身作用域的变量。但是在下面的代码中有一些我不能理解的东西:

def counter(start_at=0) :
    count = [start_at]
    def incr():
        count[0] += 1
        return count[0]
    return incr
count = counter(5)
print count() # 6
print count() # 7
count2 = counter(100)
print count2() # 101
print count() # 8

似乎在函数'counter'中,局部变量'count'永远不会被销毁,并且我可以一次又一次地运行count()来增加先前的值count[0]。在这种情况下,结尾有什么特别之处?解释器如何管理和回收包含闭包的函数的资源?希望您的帮助!

闭包在使用时被取消引用。为了方便起见,闭包在引用它们的函数的持续时间内一直存在,是的。

再次调用counter() 将创建一个新的闭包,因为产生了一个新的incr()函数对象,该对象独立于其他调用counter()所产生的其他函数。

你可以看到在返回的对象上引用的闭包单元格:

>>> incr = counter(10)
>>> incr.func_closure
(<cell at 0x102ebec20: list object at 0x10570f098>,)
>>> incr.func_closure[0]
<cell at 0x102ebec20: list object at 0x10570f098>
>>> incr.func_closure[0].cell_contents
[10]

正是这些单元格保持了从counter()count列表的原始变量引用的活性。

最新更新