2016-10-18 14 views
1

私はMRD(最大再帰の深さ)はPythonであるので、私はこれを書いたかについて興味があった:python 1000の最大再帰深度はなぜですか?

def call(n): 
    print (n) 
    return call(n+1) 

call(1) 

最終結果はウィッヒが私のために固有の番号で、979でした。なぜこの番号が標準であるのかはわかりませんでした。私は自己教えプログラマーであるので、簡単な言葉でそれを説明することを非難するでしょう。

編集:apperantlyそれは1000であるはずですが、なぜこの番号ですか?ここで

+3

重複:http://stackoverflow.com/questions/3323001/maximum-recursion-depth - これを読んで、あなたが望む答えが得られます。 – Fusseldieb

+1

彼はなぜそこにいるのかと質問しています。それ。なぜ私の結果が979だったのかを知りたいのですが、**なぜMRDがあるのか​​、それを回避する方法はありません。 –

+0

[docs](https://docs.python.org/2/library/sys.html#sys.getrecursionlimit)を読んだことがありますか? – UnholySheep

答えて

4

は、より良いテストです:

n = 0 

def test_recursion_limit(): 
    def call(): 
     global n 
     n += 1 
     call() 
    try: 
     call() 
    except RuntimeError: 
     print(n) 

test_recursion_limit() 

あなたはspam.pyに入れて、それを実行すると、それはpython2とのpython3の両方のために998を返す必要があります。これは最初のtest_recursion_limitフレームのために1つのスタックフレームの長さです。

もしあなたがipythonのようなREPLで動いているなら、すでにいくつかのフレームの中に入っていますので、より少ないカウントが表示されます - 再帰の制限が満たされていないということではなく、REPL自体の実装いくつかのスタックフレーム。

>>> # freshly opened ipython session 
>>> import inspect 
>>> len(inspect.stack()) 
10 

現在の再帰制限は、sys.getrecursionlimit()関数を呼び出すことで確認できます。既定値の1000が適切な既定値として選択されています。これは、無限回帰呼び出しを誤って実行したときにシステムリソースを守るための保護手段です。たとえば、カスタムの__getattr__実装を使用すると非常に簡単です。

スタックを正当に吹き飛ばしていて、制限を増やす必要がある場合は、sys.setrecursionlimitで変更できます。

+0

あなたが指示した通りに戻って994を返しました –

+0

なぜそれが1000ではなく_whyが再帰であるのかを説明します1000- _ –

+1

どうしてですか?どのくらいの頻度で1000を超えるリカバリが必要ですか?私は10年ほどPythonを使ってきましたが、 'sys.setrecursionlimit'を一度でも再構成する必要はありませんでした。私が再帰制限に達するたびに、それは私自身のせいかバグだった。 – wim

関連する問題