2013-12-23 12 views
6

私は実験的に次のコードを使用してPythonの最大の再帰の深さを決定しようとしていた。pythonの最大再帰深度をテストするとき、なぜ私はRuntimeErrorを何度も打つのですか?

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

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が発生しましたが、recursive()に5回以上電話をかけ続けましたか?

+1

例外のメッセージを印刷すると、ヒントが得られる可能性があります。 –

+0

は私のために期待通りに動作します –

+0

そして、同じ情報を得るには['sys.getrecursionlimit()'](http://docs.python.org/2/library/sys.html#sys.getrecursionlimit)を使うだけです。 :-) –

答えて

7

対話型インタープリタでの使用にはexit() function the Python site module setsを使用しています。

これはです。PythonコードあなたはCコードではなく、呼び出しています。これは、スタックの限界から十分離れているまで、再帰深さ例外ハンドラを数回トリガします。

上限に達している場合は、exit()を呼び出そうとしたときにスタック制限に達したために失敗します。したがってRuntimeErrorが発生し、998へのコールが返されます。ここでexit()をもう一度呼び出すと、もう一度RuntimeErrorを呼び出し、別のレベルなどに戻って、最終的にraise SystemExit()をPython関数で呼び出すのに十分なスタック領域が残るまで試行します。

代わりに、sys.exit()を使用して、スタックにひずみを追加しないようにします。

また、今後の参考として、sys.getrecursionlimit() functionを使用して、制限が何であるかをPythonに直接問い合わせてください。

4

ランタイムエラーは、再帰的(999)try - exceptでキャッチされますが、exit(0)でリレイズされます。だから、ランタイムエラーが再帰的(998)以内に再度catchedさ

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 

:後者は剰余いくつかの追加の呼び出しraise SystemExit(0)とほぼ同等であり、これらの呼び出しはRuntimeErrorが再び起こる、コードを以下のようにそれを見ますあなたのスタックが遠くまで巻き戻されてからexit(0)にRuntimeErrorを起こせない迄、5つのキャッチを合計します。

関連する問題