这个想法来自this reference。
由于扩展模块的工作方式,Python无法完全确定根集。
在我的理解中,Python解释器的操作与JVM类似,但可能更抽象。那么当前正在执行的帧以及为什么root无法在那里确定?就C扩展模块而言,为什么不单独留下它并让它自己管理它的内存呢?
另一个有趣的观点是
首先我们观察到引用循环只能由容器对象创建。
我不能创建两个自定义类并使它们相互引用吗?我对此有点想法,似乎不能直接构造一个,但是如何证明我们不能通过一些构造构造来构造这个场景?
答案 0 :(得分:1)
扩展模块一直处理原始对象指针(PyObject *
),其中一些模块将这些指针存储在最奇怪的位置(static
变量,自定义非Python数据结构中,作为有效负载数据一些其他库的事件系统的回调等),所以它不仅仅是需要检查的当前堆栈帧的本地。甚至扫描堆栈也需要特定于平台的装配魔法,就像你提到的页面一样。
可以设计一个明确传达所有这些指针的扩展API,但是对于20年前已经航行过的CPython,如果它曾经是一个选择开始(对许多人认为是一个很大的麻烦)小额福利)。
我不能创建两个自定义类并使它们相互引用吗?
继续阅读。这里“容器”的使用范围相当广泛:
这些对象可以保存对其他对象的引用。在Python列表中,字典,实例,类和元组都是容器对象的示例。整数和字符串不是容器。