检查文档: 支持循环垃圾收集
Python 对检测和收集涉及循环引用的垃圾的支持需要对象类型的支持 ,这些对象类型是其他对象的“容器”,这些对象也可能是容器 不存储对其他对象的引用或仅存储对原子类型(例如数字或字符串)的引用的类型不需要为垃圾收集提供任何显式支持。
但是我正在研究|的实现||,虽然
bytearray
本身不使用循环GC,但它创建的
bytearray
迭代器
却使用循环GC。
我的问题是,根据文档,它不需要它,因为
迭代器不引用任何可能是创建它的
bytearray
本身的容器的对象,因此没有循环依赖的机会。
这背后的原因是什么?
bytearray
itself that created it, hence no chance of cyclic dependency.
What's the reason behind that?
你对 Python 垃圾回收文档的理解是正确的。
bytearray
迭代器不需要声明
Py_TPFLAGS_HAVE_GC
,因为它不创建任何涉及容器对象的循环引用。这看起来像是 CPython 中的一个小 bug 或不一致的地方。
可能的原因
-
历史原因
:
bytearray
迭代器的实现可能在过去需要循环垃圾回收,后来代码被简化了,但标志仍然存在。 -
简化
: 为所有迭代器类型(包括那些不需要的)统一设置
Py_TPFLAGS_HAVE_GC
标志,可以简化垃圾回收器的实现。 -
潜在的边缘情况
: 可能存在一些我们没有考虑到的边缘情况,其中
bytearray
迭代器可能会被其他容器对象引用,从而导致循环引用。
影响
这个多余的标志不太可能对性能或内存使用产生明显的影响。垃圾回收器仍然会正确地处理迭代器,无论标志是否存在。
建议
在 CPython 开发者邮件列表或错误跟踪器上报告这个问题可能是一个好主意。开发者可以提供更多关于这个特定设计选择的信息。
总的来说,这是一个有趣的发现!它表明,即使在像 CPython 这样成熟的代码库中,也可能存在一些小 bug 或不一致的地方。
标签:python,garbage-collection,circular-dependency,python-c-api From: 78805476