You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:06:21