我有以下假设的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中运行
答案 0 :(得分:7)
Python中的gc模块仅负责收集循环结构。当引用计数变为0时,会立即回收像字符串这样的简单对象.gc不报告简单对象,禁用它不会阻止字符串被回收。
额外的高级细节:即使gc模块负责所有对象回收,第一个字符串仍然不会在co_consts
调用时收集,因为仍然存在对该字符串的实时引用:脚本代码对象的test
元组。