我是Python的新手,我仍然不了解python中的堆栈回溯是什么? 你能帮我解释一下吗? 非常感谢您的帮助!
答案 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行中被调用)。