9

この質問は、有用性よりも好奇心に関するものです。永久に実行されるはずの関数、たとえばデーモンを書いている場合、関数の最後から関数を再度呼び出した場合、Python はそれをどのように処理しますか?

def daemonLoop():

    # Declare locals

    # Do stuff

    daemonLoop()

Cでこれを行うとスタックオーバーフローが発生することは間違いありませんが、 CからPythonへの抽象化のレベルを考えると、処理が異なると思います。

このために私は地獄に行くでしょうか?

4

6 に答える 6

17

ほとんどすべての Python インタープリターでは、C の場合と同様に、スタック オーバーフローが発生します。これを可能にする高レベルの機能は、テール コールの最適化またはテール再帰の除去と呼ばれ、Python の慈悲深い独裁者は、これを言語に追加することに反対しています

このスタイルは Python では非慣用的であると見なされ、単純なwhile True:ループが推奨されます。

于 2011-11-02T03:31:56.047 に答える
5

最大再帰深度は、で取得sys.getrecursionlimit()および設定できますsys.setrecursionlimit()

私はこれのために地獄に行きますか?

はい。CPythonには、末尾再帰の除去/最後の呼び出しの最適化はありません。

def recurse():
    recurse()

recurse()

エラー:

  #これの1000行かそこら:
  ファイル""、2行目、再帰
RuntimeError:最大再帰深度を超えました
于 2011-11-02T03:33:08.167 に答える
1

while単純に無限ループになる可能性があるのに、なぜそのようなことを考えたのかわかりません。とにかくそれが機能するかどうかについてのあなたの質問のために:

...
  File "test.py", line 7, in daemonLoop
    daemonLoop()
  File "test.py", line 7, in daemonLoop
    daemonLoop()
RuntimeError: maximum recursion depth exceeded

そうそう、それは地獄です。

于 2011-11-02T03:34:11.943 に答える
1

Python インタープリターの C バージョン (おそらくこれを使用しています) は、daemonLoop. 他のバージョンについてはわかりません。

于 2011-11-02T03:31:38.573 に答える
0

おそらく良い考えではありません...

def forever(): forever()

forever()

RuntimeError:最大再帰深度を超えました

http://paulbarry.com/articles/2009/09/02/infinite-recursion

于 2011-11-02T03:33:06.967 に答える
0
(define forever (lambda () (forever)))

この種の再帰は、Scheme のような Lisp の方言が作られているものです!

于 2011-11-02T05:57:06.890 に答える