擅长:python、mysql、java
<p>由于python的动态特性,在到达当前例程的末尾之前,<code>cd</code>的引用不会被释放,因为(至少)python的Cpython实现没有“预读”。(如果您不知道使用的是什么python实现,那么几乎可以肯定是“Cpython”)。在一般情况下,如果一个对象仍然存在于当前名称空间中(例如,您仍然可以通过调用<code>locals()</code>)来确定对象是否应该是自由的,这实际上是不可能的。在</p>
<p>在一些不太常见的情况下,其他python实现可能能够在当前堆栈帧结束之前释放对象,但Cpython并不费心。在</p>
<p>请改为尝试以下代码,该代码演示了可以在Cpython中清除生成器:</p>
<pre><code>import weakref
def countdown(n):
while n:
yield n
n-=1
def func():
a = countdown(10)
b = weakref.ref(a)
print next(a)
print next(a)
return b
c = func()
print c()
</code></pre>
<p>当对象(包括生成器)的引用计数达到0时(在Cpython中——其他实现的工作方式可能不同)将被垃圾回收。{cpythys>只有当一个对象的引用^减少时,{cpyth才算是引用。在</p>
<p>重要的是,一旦不再引用对象,就可以由垃圾回收器清理。关于实现如何确定不再有引用的细节将留给您正在使用的特定python发行版的实现者。在</p>