RecursionError递归深度超限问题求助:无法解决自定义场景问题
解决RecursionError:递归深度超出的问题
我完全懂这种被递归问题卡得抓耳挠腮的感觉!咱们一步步来拆解你的问题,搞定这个报错。
首先,这个RecursionError的核心原因是代码进入了无限递归(或者递归层数远超Python默认的1000层限制),而且在尝试获取对象的字符串表示时触发了这个错误——简单说就是你的递归逻辑没停住,一直在循环调用。
先看你贴的代码里的几个明显问题,再针对性解决:
1. 先解决字典初始化的基础问题(虽然不是递归报错的直接原因,但会先触发KeyError)
你在populate_node里直接给tree[node]['login']赋值,但tree一开始是空字典,tree[node]根本不存在,得先初始化节点:
tree = {} def populate_node(account): node = '%(LOGIN)s,%(server_id)s' % account # 先判断节点是否存在,不存在就初始化空字典 if node not in tree: tree[node] = {} tree[node]['login'] = account['LOGIN'] tree[node]['email'] = account['EMAIL'].lower() tree[node]['server_id'] = account['server_id'] # 后面处理父节点的逻辑...
2. 揪出无限递归的根源
你贴的代码到parent = None if account['AG...就断了,但结合报错,大概率是你在处理父节点时,递归调用populate_node却没有明确的终止条件,比如:
- 找父节点的时候,不小心绕回了已经处理过的子节点,形成循环调用(比如A的父是B,B的父又是A)
- 递归调用时没有判断父节点是否存在,哪怕
parent是None还继续调用
解决办法:给递归加明确的终止条件
假设你是要递归处理父节点,一定要在父节点不存在时停止递归:
def populate_node(account): # 前面的节点初始化和赋值逻辑... # 假设你通过account获取父账户的逻辑是这样的 parent_account = get_parent_account(account) # 替换成你实际获取父节点的代码 # 关键:只有父账户存在时才递归调用,否则停止 if parent_account is not None: populate_node(parent_account)
3. 排查循环与递归的嵌套逻辑
你代码里有for account in accounts:循环,要检查有没有可能在循环里调用populate_node,而populate_node又修改了accounts或者触发了重复循环——这种情况也会导致无限递归/循环。
4. 辅助排查小技巧
如果还是找不到问题,可以在populate_node开头加个打印,追踪每次调用的账户信息,就能很快发现是不是在循环处理同一组账户:
def populate_node(account): # 打印当前处理的账户,方便追踪递归路径 print(f"正在处理账户:{account['LOGIN']}(服务器ID:{account['server_id']})") # 剩下的代码...
最后:别轻易调高递归深度(除非万不得已)
如果你确定递归逻辑是正确的,只是层数确实超过了Python默认的1000层,可以临时调高递归限制,但这只是权宜之计,最好还是把递归改成迭代(比如用栈来模拟递归),避免后续出现其他问题:
import sys sys.setrecursionlimit(2000) # 适当调高,但别设得太大
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

