为什么在CPython中发生Stackoverflow

时间:2018-09-10 17:54:03

标签: python memory-management cpython

当前python的递归深度为1000,但是我无法理解为什么所有的东西都位于堆上,所以为什么会有一个限制。

  

Python中的内存管理涉及一个私有堆,其中包含所有   Python对象和数据结构。这个私人的管理   堆是由Python内存管理器在内部确保的

避免堆栈溢出的一种常见方法是声明自己的堆栈并使用循环,但在这种情况下我们已经在使用堆了,这是python内存管理设置的限制吗?

1 个答案:

答案 0 :(得分:2)

CPython用C实现,尽管Python的数据是从堆中分配的,但实现中的本机C函数调用层必定使用平台C的堆栈。因此,例如,Python代码中对深度R的递归调用也会在运行时导致对C实现中至少R深度的C函数的调用。

因此,它主要与数据无关,而与调用堆栈深度有关。可以以不直接依赖平台C的调用堆栈的方式在C中实现Python。例如,请参见“ Stackless Python”实验。但是,这比较棘手,而且核心CPython实现不太可能会采用这种方法。