在Python中使用无限递归作为无限循环算不算罪?

9 投票
6 回答
569 浏览
提问于 2025-04-17 05:28

这个问题更多是出于好奇,而不是实用。如果我写了一个应该永远运行的函数,比如一个守护进程,如果我在这个函数的最后又调用了一次这个函数,Python会怎么处理呢?

def daemonLoop():

    # Declare locals

    # Do stuff

    daemonLoop()

我很确定在C语言中这样做会导致栈溢出,但考虑到C和Python之间的抽象层次,我猜在Python中处理方式会有所不同。

这样做会让我受到惩罚吗?

6 个回答

1

你可能在使用的Python解释器是C语言版本的。如果你一直不从daemonLoop这个函数返回,最终会出现错误。我不太确定其他版本会不会这样。

5

你可以通过 sys.getrecursionlimit() 来查看最大递归深度,也可以通过 sys.setrecursionlimit() 来设置这个深度。

这样做会让我下地狱吗?

会的。CPython(Python的一种实现)不支持尾递归优化,也就是说它不会自动处理递归调用的最后一步。

def recurse():
    recurse()

recurse()

错误:

  # 1000 or so lines of this:
  File "", line 2, in recurse
RuntimeError: maximum recursion depth exceeded
17

在几乎所有的Python解释器中,这种情况会导致栈溢出,就像在C语言中一样。允许这种情况发生的高级特性叫做尾调用优化,或者说是尾递归消除,而Python的“仁慈独裁者”反对将这个特性加入到语言中

这种写法在Python中被认为是不太符合习惯的,通常更推荐使用简单的while True:循环。

撰写回答