Python中的堆栈是什么?

Python中的堆栈是什么?,python,cpython,python-internals,Python,Cpython,Python Internals,在Python中我们称之为“堆栈”是什么?是CPython的C堆栈吗?我读到Python堆栈帧是在堆中分配的。但我认为堆叠的目标是。。。堆叠堆叠框架。那么堆栈做什么呢?Python的堆栈帧在堆上分配。但它们彼此相连,形成一个堆栈。当函数a调用函数b时,b堆栈帧指向a堆栈帧作为下一帧(从技术上讲,a是b帧的f\u back属性。) 在堆上分配堆栈帧使生成器成为可能:当生成器生成一个值时,而不是丢弃其堆栈帧,它只是从当前堆栈帧的链接列表中删除,并保存到一旁。然后,当生成器需要恢复时,其堆栈帧将重新链

在Python中我们称之为“堆栈”是什么?是CPython的C堆栈吗?我读到Python堆栈帧是在堆中分配的。但我认为堆叠的目标是。。。堆叠堆叠框架。那么堆栈做什么呢?

Python的堆栈帧在堆上分配。但它们彼此相连,形成一个堆栈。当函数
a
调用函数
b
时,
b
堆栈帧指向
a
堆栈帧作为下一帧(从技术上讲,
a
b
帧的
f\u back
属性。)


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

稍微简化了一点:

在CPython中,当计算Python堆栈帧的代码并直接调用函数时,它分配一个新的Python堆栈帧,将其链接起来……然后递归地调用该新帧上的
PyEval_EvalFrameEx

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

Python堆栈是Python框架对象的堆栈,实现为堆分配对象的简单链表

它们不是完全不相关的,但它们不是一回事


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

这个问题的答案不能回答这个问题。也许这是密切相关的,正确的做法是在那里添加第三个答案,并将其作为dup关闭…但我不确定。投票重新开放。