gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:41:36 26 4
gpt4 key购买 nike

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

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 引用。
  • 但是,第一个str对象并没有被删除,因为我们关闭了自动垃圾回收,因此它仍然存在于内存中。
  • 因为它确实存在于内存中,但无法访问,所以这似乎正是垃圾回收应该删除的对象类型。

如能解释为何未收集,我将不胜感激。

附言我知道 Python 将某些对象(包括从 -3 到 100 的整数,据我所知)视为单例,但这些特定的字符串不可能是这样的对象。

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

最佳答案

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

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

关于python - 垃圾收集在关闭一段时间后不会删除无法访问的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com