在我看来,在闭包中,我们可以引用超出其自身作用域的变量。但是在下面的代码中有一些我不能理解的东西:
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
列表的原始变量引用的活性。