在测试python最大递归深度时,为什么我会多次碰到RuntimeError?
我试图通过以下代码实验确定Python的最大递归深度:在测试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)
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()。