我们在Python中怎么称呼“堆栈”?它是CPython的C堆栈吗?我读到Python堆栈帧是在堆中分配的。但是我认为堆栈的目标是...堆栈堆栈框架。那么堆栈会做什么?
略微简化:
在CPython中,当PyEval_EvalFrameEx
评估Python堆栈框架的代码并进行直接函数调用时,它将分配一个新的Python堆栈框架,将其链接起来……然后在该新框架上递归调用PyEval_EvalFrameEx
。] >
因此,C
堆栈是解释器循环的递归调用的堆栈。Python
堆栈是Python框架对象的堆栈,实现为堆已分配对象的简单链接列表。它们并不是完全无关的,但是它们不是同一回事。
使用生成器时,这会变得更加混乱,因为当恢复它们时,这些Python堆栈框架可以在不同的位置取消链接和重新链接。这就是两个堆栈分开的原因。 (请参阅Ned的答案,这比我能解释的要好。)
Python的堆栈框架分配在堆上。但是它们彼此链接在一起形成一个堆栈。当函数PyEval_EvalFrameEx
调用函数a
时,b
堆栈帧指向b
堆栈帧作为下一帧(从技术上讲,a
是a
帧的f_back
属性。)] >
在堆上分配堆栈帧使生成器成为可能:当生成器产生一个值,而不是丢弃其堆栈帧时,只需将其从当前堆栈帧的链接列表中删除,然后保存到一边。然后,当生成器需要恢复时,其堆栈框架将重新链接到堆栈中,并继续执行。
b