Python中的堆栈是什么?

6 投票
2 回答
1103 浏览
提问于 2025-04-18 18:15

在Python中,我们把“栈”叫做什么呢?它是CPython中的C栈吗?我看到说Python的栈帧是在堆里分配的。但我一直以为栈的目的就是……把栈帧堆叠起来。那么,栈到底是干什么的呢?

2 个回答

10

在Python中,函数的调用记录(也叫栈帧)是放在一种叫做堆的地方。虽然它们是在堆上分配的,但这些栈帧是相互连接的,形成一个栈的结构。当函数a调用函数b时,b的栈帧会指向a的栈帧,形成一个链条(从技术上讲,ab栈帧的f_back属性)。

栈帧放在堆上是让生成器(generator)能够工作的原因:当生成器返回一个值时,它并不是把自己的栈帧丢掉,而是把它从当前栈帧的链表中移除,暂时放到一边。然后,当生成器需要继续执行时,它的栈帧会重新连接回栈中,继续执行之前的操作。

5

稍微简单化一下来说:

在CPython中,当PyEval_EvalFrameEx在执行一个Python代码块时,如果遇到一个直接的函数调用,它会创建一个新的Python栈帧,并把它连接起来……然后再递归地调用这个新的栈帧。

所以,C栈是解释器循环的递归调用栈。

Python栈则是Python栈帧对象的栈,这些对象是以简单的链表形式存储在堆内存中的。

这两者并不是完全无关,但也不是同一回事。

当你使用生成器时,这就变得有点复杂,因为这些Python栈帧在恢复时可以在不同的位置被解除链接和重新链接。这就是为什么这两个栈是分开的原因。(可以看看Ned的回答,他解释得比我更清楚。)

撰写回答