Python递归错误后重置代码未执行,求排查问题原因
问题排查方案
先确认是否进入触发分支
在small_ship的except RecursionError块里加print("递归错误触发,返回1"),在build_ships的if分支开头加print("进入board重置流程")。运行后看控制台有没有这些输出,如果没有,说明small_ship根本没返回1,排查方向转向:- 检查
code_1的递归逻辑,是否真的会触发RecursionError?比如递归终止条件是不是没写对,导致递归深度没达到Python的默认限制(默认是1000)。 - 检查
code_1是否抛出了其他异常,比如IndexError、KeyError等,这些异常不会被except RecursionError捕获,函数会直接崩溃,不会返回1。可以把except RecursionError改成except Exception as e,打印异常信息print(f"捕获到异常:{e}"),确认到底出了什么错。
- 检查
检查board重置代码的有效性
如果已经确认进入了if分支,但重置后没效果,大概率是全局变量的问题:- 如果
board是全局变量,在build_ships函数里直接写board = []会创建一个局部变量,不会修改全局的board。需要在函数开头加上global board声明,比如:def build_ships(): global board if small_ship(board) == 1: board = [] # 现在修改的是全局board build_ships() return 0 - 如果
board是通过参数传递的引用类型,重置时要确保是修改原对象,而不是重新赋值。比如如果board是列表,用board.clear()再重新填充默认值,而不是直接赋值新的列表。
- 如果
检查递归调用的栈溢出风险
如果每次触发递归错误就重新调用build_ships(),可能会陷入无限递归循环,最终导致整个程序崩溃(表现为无响应)。可以在重置board后,添加递归深度限制,或者改用循环代替递归调用,比如:def build_ships(): global board while True: if small_ship(board) == 1: board = [] # 重置board else: break # 成功构建,退出循环
内容的提问来源于stack exchange,提问作者Sarijen
相关产品推荐
相关产品推荐

