Python中的堆栈是什么?

usu*_* me 3 python cpython python-internals

我们在Python中称之为"堆栈"是什么?它是CPython的C堆栈吗?我读到Python堆栈帧是在堆中分配的.但我认为堆栈的目标是...堆栈堆栈帧.那堆栈到底是做什么的?

Ned*_*der 7

Python的堆栈帧在堆上分配.但它们彼此链接形成一个堆栈.当函数a调用起作用时b,b堆栈帧指向a堆栈帧作为下一帧(技术上,a是帧的f_back属性b.)

在堆上分配堆栈帧使得生成器成为可能:当生成器产生一个值而不是丢弃它的堆栈帧时,它只是从当前堆栈帧的链表中删除,并保存到一边.然后,当生成器需要恢复时,其堆栈帧将重新链接到堆栈中,并继续执行.


aba*_*ert 5

稍微过度简化:

在 CPython 中,当PyEval_EvalFrameEx评估 Python 堆栈框架的代码并进行直接函数调用时,它会分配一个新的 Python 堆栈框架,将其链接起来……然后递归调用PyEval_EvalFrameEx该新框架。

因此,C堆栈是解释器循环的递归调用堆栈。

所述的Python堆栈帧的Python对象的堆栈,如堆分配对象的简单的链表来实现。

它们并非完全无关,但它们不是一回事。

当您使用生成器时,这会稍微令人困惑,因为这些 Python 堆栈帧可以在恢复时在不同位置取消链接和重新链接。这就是为什么两个堆栈是分开的。(请参阅 Ned 的回答,它比我更好地解释了这一点。)