我希望这不是重复的,如果是这样,我深表歉意,但是已经进行了一些谷歌搜索并查看了堆栈溢出,但目前还没有发现任何东西……
MCVE
我知道,如果一个函数不断调用自身,那么如果没有堆栈溢出,这种情况就不会无限期地发生,因此在一定限制后会引发错误。例如:
def foo():
return foo()
foo()
这会导致以下错误:
RecursionError: maximum recursion depth exceeded
但是,如果我编写如下函数:
def count(n):
if n == 0:
return 0
else:
return count(n-1)+1
count(1000)
我得到一个稍微不同的错误:
RecursionError: maximum recursion depth exceeded in comparison
问题
上述错误中的“比较”指的是什么。我想我要问的是这两种情况之间有什么区别,这会导致两种不同的错误。
原文由 tim-mccurrach 发布,翻译遵循 CC BY-SA 4.0 许可协议
当引发
RecursionError
时,python 解释器还可能为您提供导致错误的调用的上下文。这仅用于调试,以提示您应该在代码中的哪个位置查看以解决问题。例如,参见此通告
str
导致不同消息的调用设置:在引入
RecursionError
的问题讨论 中没有关于此行为的文档,但您可以只搜索 cpython 代码以查找 Py_EnterRecursiveCall 的出现。然后你可以看到根据错误发生的位置返回的实际上下文: