什么是python中的堆栈回溯?

时间:2019-06-24 01:05:36

标签: python

我是Python的新手,我仍然不了解python中的堆栈回溯是什么? 你能帮我解释一下吗? 非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

堆栈跟踪在程序运行的某个时刻显示调用堆栈的状态。实际上,当程序中出现错误时,通常会遇到这些情况。

call stack是堆栈帧的堆栈(或列表)。每个堆栈帧对应于一个子流程的调用(在Python中,是一个函数或[list] -comprehension)。堆栈是一种数据结构,其中可以包含许多元素,这些元素以后进先出(LIFO)的方式删除。

这可能很难抽象地理解,但是举个例子,它很简单。

示例:

如果您有该程序:

def func1():
    func2()

def func2():
    print("func2")

然后调用函数func1,调用堆栈将最初包含func1的调用帧。然后func1调用func2,这会将调用帧添加到堆栈中。当func2退出时,相应的调用帧将从堆栈中删除,因此现在我们回到func1中。当func1退出时,其调用框架也将被删除,现在堆栈又变空了。

因此,我们将具有以下堆栈跟踪:

[empty] --> func1 --> func1 --> func1 --> [empty]
                      func2

堆栈跟踪在调试中很有用,尤其是在更复杂的示例中,它们显示程序遇到错误时的位置。例如,如果我们修改func2使其看起来像:

def func2():
    1 / 0

我们将获得一个ZeroDivisionError,其堆栈跟踪如下:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in func1
  File "<stdin>", line 2, in func2
ZeroDivisionError: division by zero

因此我们可以看到错误发生在func2的第2行(在func1的第2行中被调用)。