这个问题更多是关于好奇而不是实用。如果我正在编写一个应该永远运行的函数,例如一个守护进程,如果我从函数末尾再次调用该函数,Python将如何处理它?</ p>
def daemonLoop():
# Declare locals
# Do stuff
daemonLoop()
我很确定在 C 中执行此操作会导致堆栈溢出,但考虑到从 C 到Python的抽象级别,我猜测的是处理方式不同。
我会为此而下地狱吗?
答案 0 :(得分:17)
在几乎所有会导致堆栈溢出的Python解释器中,就像在C中那样。允许这种情况的更高级别的特性称为Tail Call Optimization或尾部递归消除,the benevolent dictator of Python opposes adding this to the language。 / p>
这种风格被认为是Python的非惯用风格,首选简单的while True:
循环。
答案 1 :(得分:5)
可以使用sys.getrecursionlimit()
检索最大递归深度,并使用sys.setrecursionlimit()
进行设置。
我会为此而下地狱吗?
是。 CPython没有尾部递归消除/最后呼叫优化。
def recurse():
recurse()
recurse()
错误:
# 1000 or so lines of this: File "", line 2, in recurse RuntimeError: maximum recursion depth exceeded
答案 2 :(得分:1)
如果你永远不会从daemonLoop
返回,那么Python解释器的C版本(可能就是你正在使用的版本)最终会引发错误。我不确定其他版本。
答案 3 :(得分:1)
我不知道为什么当你可以简单地拥有一个无限的while
循环时,你会考虑做类似的事情。无论如何,你的问题是否有效:
...
File "test.py", line 7, in daemonLoop
daemonLoop()
File "test.py", line 7, in daemonLoop
daemonLoop()
RuntimeError: maximum recursion depth exceeded
所以是的,不管怎样。
答案 4 :(得分:0)
可能不是个好主意......
def forever(): forever()
forever()
RuntimeError:超出最大递归深度
答案 5 :(得分:0)
(define forever (lambda () (forever)))
这种递归是像Scheme那样的Lisp方言!