
Python 默认递归深度限制是 1000,超过会抛出 RecursionError: maximum recursion depth exceeded。这不是内存不足导致的崩溃,而是解释器主动拦截,防止栈溢出和无限递归拖垮程序。
为什么设为 1000?
这个值是 CPython 在多数系统上权衡安全与实用的结果:太小容易误伤正常深层递归(比如处理深度嵌套 JSON 或树结构),太大则可能耗尽调用栈空间,引发段错误或进程终止。它不取决于物理内存,而受限于操作系统为每个线程分配的栈大小(通常几 MB)。
如何查看和修改递归限制
使用标准库 sys 模块:
-
sys.getrecursionlimit()查看当前限制(默认一般为 1000) -
sys.setrecursionlimit(n)设置新上限,例如sys.setrecursionlimit(2000)
⚠️ 注意:增大限制不能解决根本问题。若递归逻辑本身存在缺陷(如缺少终止条件、收敛过慢),调高限制只会延迟报错,甚至导致程序直接崩溃。不建议无差别调高,尤其在线上服务中。
立即学习“Python免费学习笔记(深入)”;
递归调用的真实风险不止“超限”
除了触发 RecursionError,常见隐患包括:
-
隐式递归:重载
__str__、__repr__时不小心打印自身对象,引发链式调用 - 尾递归未优化:Python 不支持尾递归优化(TCO),每次调用都压栈,无法靠改写成尾递归来规避深度问题
- 不可控输入场景:如解析用户提交的嵌套 JSON、XML 或自定义 DSL,深度由外部决定,极易越界
- 多线程环境差异:主线程限制对子线程无效,但子线程默认栈更小,实际可承受深度反而更低
更稳妥的替代方案
遇到深层嵌套或不确定规模的数据,优先考虑迭代实现:
- 用显式栈(
list)模拟递归过程,控制内存与执行流 - 对树/图遍历,改用 BFS(队列)或 DFS(手动栈)
- 处理嵌套结构(如 JSON)时,配合深度计数器 + 提前截断,或使用生成器分批处理
- 必要时引入第三方库(如
json模块本身已做迭代解析;ast.parse对深层代码有保护机制)
递归简洁有力,但 Python 的执行模型决定了它不适合“深”任务。判断是否该用递归,关键不是“能不能写”,而是“值不值得冒这个风险”。










