9

这个问题更多的是关于好奇心而不是实用性。如果我正在编写一个应该永远运行的函数,例如一个守护进程,如果我从函数末尾再次调用该函数,Python 将如何处理它?

def daemonLoop():

    # Declare locals

    # Do stuff

    daemonLoop()

我相当肯定在C中这样做会导致堆栈溢出,但考虑到从C到 Python 的抽象级别,我猜事情的处理方式不同。

我会为此下地狱吗?

4

6 回答 6

17

在几乎所有会导致堆栈溢出的 Python 解释器中,就像在 C 中一样。允许这样做的高级功能称为尾调用优化或尾递归消除,Python 的仁慈独裁者反对将其添加到语言中

这种风格被认为是 Python 的非惯用风格,while True:首选简单循环。

于 2011-11-02T03:31:56.047 回答
5

可以使用 检索sys.getrecursionlimit()和设置最大递归深度sys.setrecursionlimit()

我会为此下地狱吗?

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

def recurse():
    recurse()

recurse()

错误:

  # 大约 1000 行:
  文件“”,第 2 行,递归
RuntimeError:超出最大递归深度
于 2011-11-02T03:33:08.167 回答
1

如果您从不从daemonLoop. 我不确定其他版本。

于 2011-11-02T03:31:38.573 回答
1

我不知道当你可以简单地有一个无限while循环时,你为什么会考虑做这样的事情。无论如何,关于它是否会起作用的问题:

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

所以,是的,这是地狱。

于 2011-11-02T03:34:11.943 回答
0

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

def forever(): forever()

forever()

RuntimeError:超出最大递归深度

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

于 2011-11-02T03:33:06.967 回答
0
(define forever (lambda () (forever)))

这种递归就是像 Scheme 这样的 Lisp 方言的用途!

于 2011-11-02T05:57:06.890 回答