Python 为什么增加递归深度会导致堆栈溢出错误?

Python 为什么增加递归深度会导致堆栈溢出错误?,python,Python,我将无限递归函数定义为: >>>def f(): >>> f() >>> 然后我调用了这个函数,结果发生了: >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in f File "

我将无限递归函数定义为:

>>>def f():
>>>   f()
>>>
然后我调用了这个函数,结果发生了:

>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
File "<stdin>", line 2, in f
File "<stdin>", line 2, in f
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
>>>
然后我再次调用函数,但是

>>> f()
Traceback (most recent call last):
File "<stdin>", line 2, in f
File "<stdin>", line 2, in f
File "<stdin>", line 2, in f
[Previous line repeated 997 more times]
MemoryError: Stack overflow
>>f()
回溯(最近一次呼叫最后一次):
文件“”,第2行,在f中
文件“”,第2行,在f中
文件“”,第2行,在f中
[上一行重复了997次]
内存错误:堆栈溢出

我想知道,在将递归限制更改为2147483647之后,为什么Python仍然将递归限制为1000?

由于第一条错误消息是:

RecursionError: maximum recursion depth exceeded
然后在增加递归深度后,错误消息更改为:

MemoryError: Stack overflow
从以下文件:

将Python解释器堆栈的最大深度设置为limit。这个限制可以防止无限递归导致C堆栈溢出和Python崩溃

因此,通过增加递归限制,程序使Python解释器崩溃

由于Python不优化尾部递归,无限递归会导致堆栈溢出(内存耗尽)

在许多实际应用程序中,有必要在不使用递归的情况下实现函数,以避免堆栈溢出内存错误


另请参见:

您能看到两次错误的不同之处吗?这意味着递归已更改为您定义它的方式第二个错误不是递归错误。这是一个内存错误。您应该运行程序并检查任务管理器(在windows上),或者检查内存使用情况。也许你没有安装足够的内存。好吧,我看到@Yeshwin Verma程序员感谢我有8GB内存。对于1000次递归树来说足够了吗@Foxcric@ChristopherPeisert根据共识,标签不属于标题(在常规句子中提及技术是可以的)。非常感谢@Christopher Peisert。现在我完全明白了。但是我可以访问由于大递归而溢出的堆栈并改变它的大小吗?@DebtanuGupta:实际的底层堆栈是有限的,因为计算机是有限的。无限递归函数总是会破坏堆栈;“你们所做的一切毫无意义。”起初我对这两个错误感到困惑,一个是RecursionError,另一个是MemoryError。现在我看到,堆栈的大小只能容纳1000个递归的数据。因此,我想知道是否有任何方法可以将堆栈大小增加到递归的1000倍以上。@DebtanuGupta:我怀疑它将超过1000倍,它可能只是将回溯调整到最近的1000倍。如果我试着做你所做的,Python只是在破坏C堆栈时崩溃;我甚至没有得到一个
内存错误
,只是一个硬崩溃(分段错误)。您的设置有所不同,但我无法确定具体如何设置(我正在运行WSLv2下的Alpine Linux中的
ipython
)。
MemoryError: Stack overflow