>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection
a 和 b 可能是垃圾收集或 a 和 b 必须是垃圾收集?如何证明?
>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection
a 和 b 可能是垃圾收集或 a 和 b 必须是垃圾收集?如何证明?
Python 变量只是引用对象的名称。在您的示例中,您有三个对象,整数 4、5 和 6。
整数 6 被 a 引用,5 最初被 b 引用,4 被 c 和 d 引用。然后你打电话del(b)
。这从整数 5 中删除了引用。所以此时,6 和 4 仍然被引用,而 5 没有被引用。
究竟如何处理垃圾收集是一个实现细节。
现在看这里:
当前实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是返回对现有对象的引用
所以你在这个例子中使用的数字永远不会被垃圾回收。
至于何时收集垃圾,请参阅以下文档gc.set_threshold(threshold0, threshold1, threshold2)
:
为了决定何时运行,收集器跟踪自上次收集以来对象分配和释放的数量。当分配数减去解除分配数超过阈值0时,开始收集。最初只检查第 0 代。如果自检查第 1 代以来检查第 0 代的次数超过阈值 1 次,则也检查第 1 代。同样,threshold2 控制在收集第 2 代之前收集第 1 代的数量。
阈值的标准值为;
In [2]: gc.get_threshold()
Out[2]: (700, 10, 10)
CPython 使用引用计数。Jython 和 IronPython 使用其底层 VM 的 GC。话虽如此,CPython 实习小整数,包括那些在你的代码中使用的,因此那些特别是永远不会被 GCed。
垃圾收集的工作方式是一个实现细节。另请参阅问题“<a href="http://docs.python.org/2/faq/programming.html#my-class-defines-del-but-it-is-not-called-when-i- delete-the-object" rel="nofollow">我的类定义了__del__
,但是当我删除对象时它没有被调用”在 Python FAQ 中。
在 CPython 中,引用计数是默认的,这意味着对象将在最后一个引用被删除的那一刻被删除。因此,如果您有一个名为 的对象a
,该对象仅在当前范围内引用,del a
则会将其完全删除。
但是,CPython 还维护一个循环对象列表,以处理引用计数失败的特殊情况。您无法判断最终出现在此列表中的对象何时会被删除,但最终它们会被删除。
在其他 Python 实现中,所有对象可能都有一个完整的垃圾收集器,因此您永远不应该依赖del a
实际删除对象。这也是为什么您应该始终手动关闭文件描述符.close()
以防止资源泄漏直到程序关闭的原因。