垃圾收集在关闭一段时间后不会删除无法访问的对象

时间:2018-01-23 00:39:45

标签: python garbage-collection

我有以下假设的Python程序,它使用了一些垃圾收集器函数(documentation):

enum

程序打印import gc # Should turn automatic garbage collection off gc.disable() # Create the string a = "Awesome string number 1" # Make the previously assigned string unreachable # (as an immutable object, will be replaced, not edited) a = "Let's replace it by another string" # According to the docs, collect the garbage and returns the # number of objects collected print gc.collect() ,这对我来说很奇怪,因为:

  • 首次分配时,0对象已创建,并由str引用。
  • 在第二次分配时,会创建第二个a对象并str,现在由a引用。
  • 但是,第一个a对象从未被删除,因为我们已经关闭了自动垃圾收集,因此它仍然存在于内存中。
  • 因为它确实存在于内存中,但是无法访问,这似乎就像垃圾收集应该删除的那种对象。

我非常感谢解释为什么没有收集它。

P.S。我知道Python会将一些对象(包括从3到100的整数,就我记忆而言)视为单例,但这些特定的字符串无法成为这样的对象。

P.P.S我将它作为整个程序运行,而不是在shell中运行

1 个答案:

答案 0 :(得分:7)

Python中的gc模块仅负责收集循环结构。当引用计数变为0时,会立即回收像字符串这样的简单对象.gc不报告简单对象,禁用它不会阻止字符串被回收。

额外的高级细节:即使gc模块负责所有对象回收,第一个字符串仍然不会在co_consts调用时收集,因为仍然存在对该字符串的实时引用:脚本代码对象的test元组。