在Python中使用无限递归作为无限循环算不算罪?
这个问题更多是出于好奇,而不是实用。如果我写了一个应该永远运行的函数,比如一个守护进程,如果我在这个函数的最后又调用了一次这个函数,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:
循环。