这个问题更多的是关于好奇心而不是实用性。如果我正在编写一个应该永远运行的函数,例如一个守护进程,如果我从函数末尾再次调用该函数,Python 将如何处理它?
def daemonLoop():
# Declare locals
# Do stuff
daemonLoop()
我相当肯定在C中这样做会导致堆栈溢出,但考虑到从C到 Python 的抽象级别,我猜事情的处理方式不同。
我会为此下地狱吗?
这个问题更多的是关于好奇心而不是实用性。如果我正在编写一个应该永远运行的函数,例如一个守护进程,如果我从函数末尾再次调用该函数,Python 将如何处理它?
def daemonLoop():
# Declare locals
# Do stuff
daemonLoop()
我相当肯定在C中这样做会导致堆栈溢出,但考虑到从C到 Python 的抽象级别,我猜事情的处理方式不同。
我会为此下地狱吗?
在几乎所有会导致堆栈溢出的 Python 解释器中,就像在 C 中一样。允许这样做的高级功能称为尾调用优化或尾递归消除,Python 的仁慈独裁者反对将其添加到语言中。
这种风格被认为是 Python 的非惯用风格,while True:
首选简单循环。
可以使用 检索sys.getrecursionlimit()
和设置最大递归深度sys.setrecursionlimit()
。
我会为此下地狱吗?
是的。CPython 没有尾递归消除/最后调用优化。
def recurse():
recurse()
recurse()
错误:
# 大约 1000 行: 文件“”,第 2 行,递归 RuntimeError:超出最大递归深度
如果您从不从daemonLoop
. 我不确定其他版本。
我不知道当你可以简单地有一个无限while
循环时,你为什么会考虑做这样的事情。无论如何,关于它是否会起作用的问题:
...
File "test.py", line 7, in daemonLoop
daemonLoop()
File "test.py", line 7, in daemonLoop
daemonLoop()
RuntimeError: maximum recursion depth exceeded
所以,是的,这是地狱。
可能不是个好主意......
def forever(): forever()
forever()
RuntimeError:超出最大递归深度
(define forever (lambda () (forever)))
这种递归就是像 Scheme 这样的 Lisp 方言的用途!