Python中sys.setrecursionlimit设置后递归次数不符问题咨询
问题分析与解答
为什么递归仅执行170次而非200次?
- Jupyter Notebook的运行环境启动后,内核已完成一系列初始化操作,这些操作会占用一部分递归栈空间。你设置的
sys.setrecursionlimit(200)是Python允许的总递归栈深度上限,减去Jupyter本身占用的栈帧数量后,留给递归函数fun1的可用栈深度只剩170左右,因此递归只能执行170次就触达上限。
递归调用报错的原因
- 每次递归调用
fun1()时,都会在调用栈中创建新的栈帧,用于存储函数的局部变量、返回地址等信息。当调用栈深度超过当前可用栈空间(总上限200减去Jupyter已占用部分),Python会触发RecursionError报错,这是内置的保护机制,防止无限递归耗尽系统内存。
为什么其他编辑器中没有这个问题?
- 普通Python脚本的运行环境(如命令行、PyCharm等)启动时的初始化操作更少,占用的递归栈空间远小于Jupyter。设置
sys.setrecursionlimit(200)后,可用的递归栈深度接近200,因此递归能执行到接近200次才会报错。
补充验证小技巧
- 你可以在Jupyter中打印当前的栈深度,确认Jupyter本身占用的栈帧数量:
用200减去这个数值,结果大致就是你能递归的次数。import sys print(len([f for f in sys._current_frames().values()][0].f_traceback.tb_frame.f_back))
你提供的测试代码:
import sys i=0 def fun1(): global i print("hello i = ",i) i+=1 fun1() print("Welcome") sys.setrecursionlimit(200) fun1() print(sys.getrecursionlimit())
内容的提问来源于stack exchange,提问作者Tarun_Saini
相关产品推荐
相关产品推荐

