直接回答:CPython 默认递归深度限制是 1000(sys.getrecursionlimit()),目的是在耗尽底层栈之前抛出可捕获、可恢复的 RecursionError,而不是让整个进程段错误崩溃。每次递归调用都要建立一个 Python 栈帧,早期版本每个帧还直接消耗 C 调用栈,没有限制的话失控递归会触发真正的栈溢出,进程连 traceback 都来不及打印。

import sys
sys.setrecursionlimit(10_000)   # 调大限制

def dfs(node, depth=0):
    if not node:
        return depth
    return dfs(node.next, depth + 1)   # 深链表会触限

展开解析sys.setrecursionlimit() 可以调大,但风险是超过真实栈容量后进程直接崩溃,没有任何异常可捕获,容器环境里只会看到一个 exit code 139,排查成本很高。3.11 起 CPython 做了帧内联,Python 调用 Python 不再消耗 C 栈,同样深度下安全得多,但限制仍作为保护性默认值保留。另外限制计数的是当前线程的调用深度,新线程有独立计数。还要注意 traceback、日志、序列化这类"隐式递归"库代码会叠加在业务递归之上,实际可用深度比预想小。

实践要点:深度不可控的遍历(树、链表、图、解析嵌套结构)优先改写成迭代加显式栈;分治类递归深度是 O(log n),无需调整;动态规划递归可配 functools.lru_cache 记忆化,但注意记忆化只减少重复计算,不降低最大栈深。

追问方向:Python 为什么不做尾递归优化?如何把递归机械地改写成显式栈?

(约 460 字)