python默认递归深度为1000层,这是cpython基于线程c栈空间(如linux默认8mb)保守估算的安全阈值,旨在主动拦截栈溢出而非等待崩溃;超过会抛recursionerror,盲目调高limit可能导致段错误。

Python 递归操作容易触发 RecursionError,根本原因不是代码写错了,而是解释器在用 C 栈做“主动刹车”——它宁可报错,也不让程序把底层栈吃穿。
为什么默认只给 1000 层?
这个数字和内存大小无关,只跟线程的 C 栈空间有关。Linux 默认主线程栈约 8MB,每层递归至少占 1–2KB 帧,1000 层 ≈ 1–2MB,留了足够缓冲防爆栈。设太高不等于“更安全”,反而可能跳过 RecursionError 直接段错误(Segmentation fault)或被系统 Killed: 9。
哪些地方最容易悄悄超限?
-
__repr__或__str__里写了return f"Node({self.children})"—— 一打印就递归展开整个树 - pytest/mock 环境下,
mock.patch+ 断言失败 → 额外多出 50–100 层调用帧 - 用户提交的 JSON/YAML 有 1500 层嵌套,而解析逻辑没做深度防护
- CI 容器中
ulimit -s只有 4096 KB,实际撑不到 1000 层就崩
怎么快速确认是不是真递归问题?
别等完整 traceback,加两行现场诊断:
import sys, traceback
print("Current depth:", len(traceback.extract_stack()))
print("Last 3 frames:", traceback.extract_stack()[-3:])
如果输出里反复出现同一个函数名(如 parse_config),是真实递归;如果夹着 _pytest、Mock、__repr__,优先删掉这些钩子再测。
改 sys.setrecursionlimit() 的安全边界在哪?
真要调,必须同步满足三件事:
- 先查系统栈上限:
import resource; resource.getrlimit(resource.RLIMIT_STACK)(Unix) - 按每层 ≈ 1.5KB 推算:4MB 栈 → 最多安全设
sys.setrecursionlimit(2500),不是 10000 - 若用多线程,还得配
threading.stack_size(8 * 1024 * 1024),否则 limit 再高也无效
真正难的不是算数,是区分“数据确实深”和“代码在帮倒忙”——比如 @property 里写 return self.id 这种无限自引用,调再高的 limit 也没用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











