【问题标题】:What is the stack in Python?Python中的堆栈是什么?
【发布时间】:2014-10-16 22:02:14
【问题描述】:

我们在 Python 中将“堆栈”称为什么?是 CPython 的 C 栈吗?我读到 Python 堆栈帧是在堆中分配的。但我认为堆栈的目标是......堆叠堆栈帧。那么堆栈的作用是什么?

【问题讨论】:

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

标签: python cpython python-internals


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    稍微过于简单化:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 2014-08-09
      • 1970-01-01
      • 2016-03-01
      • 2010-11-09
      • 2010-10-14
      • 2011-01-20
      • 1970-01-01
      • 2016-01-29
      相关资源
      最近更新 更多