在Python中对无限循环使用无限递归是否是一种罪?

问题描述:

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

def daemonLoop(): 

    # Declare locals 

    # Do stuff 

    daemonLoop() 

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

我会为此下地狱吗?

+0

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

几乎所有的Python解释器都会导致堆栈溢出,就像在C中一样。允许执行此操作的更高级功能称为Tail Call Optimization或尾递归消除,以及the benevolent dictator of Python opposes adding this to the language

这种风格被认为是Python的非惯用语言,并且最好使用简单的while True:循环。

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

+0

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

可能不是一个好主意....

def forever(): forever() 

forever() 

RuntimeError:最大递归深度超过

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

最大递归深度可以用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 

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

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

所以,是的,地狱它是。

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

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

+0

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