为什么python无法确定根并使用标记扫描?

时间:2014-10-05 08:07:23

标签: python garbage-collection

这个想法来自this reference

  

由于扩展模块的工作方式,Python无法完全确定根集。

在我的理解中,Python解释器的操作与JVM类似,但可能更抽象。那么当前正在执行的帧以及为什么root无法在那里确定?就C扩展模块而言,为什么不单独留下它并让它自己管理它的内存呢?

另一个有趣的观点是

  

首先我们观察到引用循环只能由容器对象创建。

我不能创建两个自定义类并使它们相互引用吗?我对此有点想法,似乎不能直接构造一个,但是如何证明我们不能通过一些构造构造来构造这个场景?

1 个答案:

答案 0 :(得分:1)

扩展模块一直处理原始对象指针(PyObject *),其中一些模块将这些指针存储在最奇怪的位置(static变量,自定义非Python数据结构中,作为有效负载数据一些其他库的事件系统的回调等),所以它不仅仅是需要检查的当前堆栈帧的本地。甚至扫描堆栈也需要特定于平台的装配魔法,就像你提到的页面一样。

可以设计一个明确传达所有这些指针的扩展API,但是对于20年前已经航行过的CPython,如果它曾经是一个选择开始(对许多人认为是一个很大的麻烦)小额福利)。

  

我不能创建两个自定义类并使它们相互引用吗?

继续阅读。这里“容器”的使用范围相当广泛:

  

这些对象可以保存对其他对象的引用。在Python列表中,字典,实例,类和元组都是容器对象的示例。整数和字符串不是容器。