gpt4 book ai didi

python - 垃圾收集器和 gc 模块

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:47 25 4
gpt4 key购买 nike

当我对以下短语产生疑问时,我正在阅读文档:

Since the collector supplements the reference counting already used in Python, you can disable the collector if you are sure your program does not create reference cycles.

这是什么意思?如果我禁用垃圾收集器 (gc.disable()) 并执行如下操作:

a = 'hi'
a = 'hello'

'hi' 会保留在内存中吗?我需要自己释放内存吗?

我从那句话中了解到,gc 是一个额外的工具,专门用于捕获引用循环,如果它被禁用,内存仍然会使用对象的引用计数器自动清理,但不会管理引用循环.是吗?

最佳答案

在 CPython 中,当引用计数降为 0 时,对象会立即从内存中清除。

当您将 a 重新绑定(bind)到 'hello' 时,'hi' 字符串对象的引用计数会减少。如果它达到 0,它将从内存中删除。

因此,垃圾收集器只需要处理(间接或直接)相互引用的对象,从而防止引用计数降为 0。

字符串不能引用其他对象,因此垃圾收集器不感兴趣。但是任何可以引用其他东西的东西(例如列表或字典等容器类型,或者任何 Python 类或实例)都可以产生循环引用:

a = []  # Ref count is 1
a.append(a) # A circular reference! Ref count is now 2
del a # Ref count is decremented to 1

垃圾收集器检测到这些循环引用;没有其他引用 a,所以最终 gc 进程打破了循环,让引用计数自然地降为 0。

顺便说一句,Python 编译器将 'hi''hello' 等字符串文字作为 常量 与生成的字节码捆绑在一起,总是至少有一个对此类对象的引用。此外,源代码中使用的与正则表达式 [a-zA-Z0-9_] 匹配的字符串文字是 interned;变成单例以减少内存占用,因此使用相同字符串文字的其他代码块将持有对相同共享字符串的引用。

关于python - 垃圾收集器和 gc 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24587475/

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