2011-11-02 37 views
8

这个问题更多关于好奇而非效用。如果我正在编写一个应该永远运行的函数,比如一个守护进程,那么如果我从函数的结尾再次调用函数,Python将如何处理它?在Python中对无限循环使用无限递归是否是一种罪?

def daemonLoop(): 

    # Declare locals 

    # Do stuff 

    daemonLoop() 

我相当肯定,在ç这样做会导致堆栈溢出,但由于抽象层次从Ç到Python我猜的东西是不同的处理。

我会为此下地狱吗?

+0

人们会去恶魔循环,而不是守护进程;-)在Python中,你只会得到一个异常,“RuntimeError:超过最大递归深度”。 –

回答

1

Python解释器(可能是您正在使用的)的C版本将最终引发错误,如果您从不从daemonLoop返回。我不确定其他版本。

+0

如果你从不回来,为什么口译员会提出错误?这要么不明确,要么错误。 – agf

5

最大递归深度可以用sys.getrecursionlimit()来检索并sys.setrecursionlimit()设置。

Would I go to hell for this?

是的。 CPython没有尾递归消除/最后呼叫优化。

def recurse(): 
    recurse() 

recurse() 

错误:

 
    # 1000 or so lines of this: 
    File "", line 2, in recurse 
RuntimeError: maximum recursion depth exceeded 
1

我不知道为什么你会认为这样做类似的东西时,你可以简单地用无限while循环。无论如何,你的问题是否会起作用:

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

所以,是的,地狱它是。

0
(define forever (lambda() (forever))) 

这种递归是Lisp方言像Scheme所做的!

+0

是的,但那不是问题。 – delnan