Python默认递归深度限制为1000,是CPython根据系统栈大小保守设定的安全值;可通过sys.getrecursionlimit()查看、sys.setrecursionlimit(n)修改,但不宜过高,推荐转为迭代等结构优化替代。

Python默认递归深度限制是1000,超过就会抛出RecursionError: maximum recursion depth exceeded——这不是内存不够,而是解释器主动拦截,防止C层栈溢出导致进程崩溃。
为什么设成1000?
这个值是CPython在初始化时根据系统栈大小保守估算的。它预留了安全余量,避免递归调用把C函数调用栈撑爆(C栈一般只有1~8MB,远小于Python堆内存)。设太高可能不报错就直接段错误;设太低又容易误伤正常逻辑。
如何查看和修改递归限制
用sys.getrecursionlimit()查当前值,用sys.setrecursionlimit(n)改。比如:
>>> import sys
>>> sys.getrecursionlimit()
1000
>>> sys.setrecursionlimit(2000)
- 修改只影响当前Python进程,不改变系统或其它进程
- 不能无限制提高:超过系统栈承载能力时,程序会直接core dump或静默退出(尤其在Linux上)
- 建议提升幅度不超过原值的2~3倍,并配合实际压测验证
比调高限制更靠谱的解法
真正健壮的代码不该依赖调大限制,而应从结构上规避深层递归:
立即学习“Python免费学习笔记(深入)”;
-
转为迭代:用显式栈(list)模拟递归过程,例如DFS遍历树时用
stack = [root]循环处理 - 尾递归优化(手动):把递归调用放在函数末尾,再用循环重写。Python本身不支持尾递归优化,但逻辑可平移
-
分治+缓存:对重复子问题用
@lru_cache,减少递归分支数量(如斐波那契) - 设置递归守卫:在函数开头加深度计数参数,到达阈值时主动返回或抛出自定义异常,便于定位和降级
调试栈溢出的小技巧
遇到RecursionError别急着调limit,先确认是不是真递归过深:
- 加一句
import traceback; traceback.print_stack()在可疑函数里快速看调用链 - 用
sys.settrace()做轻量级递归深度监控(适合临时诊断) - 检查是否无意写了死递归:比如忘记更新终止条件、参数未缩小、对象引用循环等









