我们称之为" stack"在Python?它是CPython的C堆栈吗?我读到Python堆栈帧是在堆中分配的。但我认为堆栈的目标是...堆栈堆栈帧。那堆栈到底是做什么的?
答案 0 :(得分:7)
Python的堆栈帧在堆上分配。但它们彼此链接形成一个堆栈。当函数a
调用函数b
时,b
堆栈帧指向a
堆栈帧作为下一帧(从技术上讲,a
是{{1} f_back
框架的属性。)
在堆上分配堆栈帧是使生成器成为可能的原因:当生成器生成一个值而不是丢弃其堆栈帧时,它只是从当前堆栈帧的链接列表中删除,并保存到旁边。然后,当生成器需要恢复时,其堆栈帧将重新链接到堆栈中,并继续执行。
答案 1 :(得分:4)
过度简化:
在CPython中,当PyEval_EvalFrameEx
正在评估Python堆栈框架的代码并进行直接函数调用时,它会分配一个新的Python堆栈框架,将其链接起来...然后递归调用PyEval_EvalFrameEx
on新框架。
因此, C 堆栈是一个解释器循环的递归调用堆栈。
Python 堆栈是一堆Python框架对象,实现为堆分配对象的简单链接列表。
他们并非完全不相关,但他们不是一回事。
当你使用生成器时,这会让人感到更加困惑,因为这些Python堆栈帧可以在它们恢复时取消链接并在不同的地方重新链接。这就是为什么两个堆栈是分开的。 (见Ned的答案,这比我能解释得更好。)