在测试python最大递归深度时,为什么我会多次碰到RuntimeError?

在测试python最大递归深度时,为什么我会多次碰到RuntimeError?,python,cpython,Python,Cpython,我试图通过以下代码实验确定Python的最大递归深度: def recursive(i): i = i + 1 try: recursive(i) except RuntimeError: print 'max depth == %d' % i exit(0) recursive(0) def recursive(i): try: i = i + 1 recursive(i)

我试图通过以下代码实验确定Python的最大递归深度:

def recursive(i):
    i = i + 1
    try:
        recursive(i)
    except RuntimeError:
        print 'max depth == %d' % i
        exit(0)

recursive(0)
def recursive(i):
    try:
        i = i + 1
        recursive(i)
    except RuntimeError as exc:
        print 'max depth == %d' % i
        try:
            exit(0)
        except RuntimeError:
            print 'RuntimeError in exit'

recursive(0)
但当我运行它时,发生了这样的情况:

[ hive ~ ]$ python recursive.py 
max depth == 999
max depth == 998
max depth == 997
max depth == 996
max depth == 995
max depth == 994
为什么我的程序在第一次遇到
RuntimeError
时没有立即退出,而是继续运行了5次对
recursive()
的调用?

您正在使用交互解释器

这是您正在调用的Python代码,而不是C代码。这会多次触发递归深度异常处理程序,直到距离堆栈限制足够远

当您正好遇到限制时,尝试调用
exit()
失败,因为您达到了堆栈限制。因此会引发
运行时错误
,返回对
998
的调用。在这里,您尝试再次调用
exit()
,这将再次尝试做更多的工作,提高
运行时错误,降低到另一个级别,等等,直到有足够的堆栈空间最终在python函数中调用
raise SystemExit()

改为使用,以避免向堆栈添加更多应变


或者,作为将来的参考,使用直接询问Python限制是什么。

运行时错误在递归(999)
try
-
中捕获,除了
,但通过退出(0)
重新读取。后者大致相当于
raisesystemexit(0)
对一些附加调用进行模化,这些调用使
RuntimeError
再次发生,如下代码所示:

def recursive(i):
    i = i + 1
    try:
        recursive(i)
    except RuntimeError:
        print 'max depth == %d' % i
        exit(0)

recursive(0)
def recursive(i):
    try:
        i = i + 1
        recursive(i)
    except RuntimeError as exc:
        print 'max depth == %d' % i
        try:
            exit(0)
        except RuntimeError:
            print 'RuntimeError in exit'

recursive(0)
输出

max depth == 999
RuntimeError in exit

因此,在递归(998)中再次捕获运行时错误,以此类推,总共捕获5次,直到堆栈远离
退出(0)时为止
无法引发运行时错误。

打印异常消息可能会给您一个线索。正如预期的那样,您可以使用它来获取相同的信息。:-)@MartijnPieters用2.7Ah复制,啊<代码>退出()不是
sys.exit
。它是由
站点
模块设置的
exit()。