在Python中对无限循环使用无限递归是否是一种罪?
这个问题更多关于好奇而非效用。如果我正在编写一个应该永远运行的函数,比如一个守护进程,那么如果我从函数的结尾再次调用函数,Python将如何处理它?在Python中对无限循环使用无限递归是否是一种罪?
def daemonLoop():
# Declare locals
# Do stuff
daemonLoop()
我相当肯定,在ç这样做会导致堆栈溢出,但由于抽象层次从Ç到Python我猜的东西是不同的处理。
我会为此下地狱吗?
几乎所有的Python解释器都会导致堆栈溢出,就像在C中一样。允许执行此操作的更高级功能称为Tail Call Optimization或尾递归消除,以及the benevolent dictator of Python opposes adding this to the language。
这种风格被认为是Python的非惯用语言,并且最好使用简单的while True:
循环。
Python解释器(可能是您正在使用的)的C版本将最终引发错误,如果您从不从daemonLoop
返回。我不确定其他版本。
如果你从不回来,为什么口译员会提出错误?这要么不明确,要么错误。 – agf
可能不是一个好主意....
def forever(): forever()
forever()
RuntimeError:最大递归深度超过
最大递归深度可以用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
所以,是的,地狱它是。
人们会去恶魔循环,而不是守护进程;-)在Python中,你只会得到一个异常,“RuntimeError:超过最大递归深度”。 –