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

Python循环中追加字典时被覆盖的问题求助

问题分析

你遇到的核心问题是:你试图用字典的更新操作去合并列表,但字典的update()或|=会直接覆盖resources键对应的值,而非追加列表元素。

看你的代码,i=1时res被初始化为{'resources': [第一页设备列表]};i>1时,你用res |= ...传入的是{'resources': [当前页设备列表]},字典合并操作会直接把res['resources']替换成当前页的列表,之前的数据自然就丢了。

另外代码还有几个冗余/风险点:

  • 嵌套的for value in devices和for k,v in devices[value].items()完全没必要,API返回的JSON结构可直接通过键访问,无需遍历所有顶层键。
  • 计算counter的方式过于复杂,直接取对应键的值即可。
  • res在循环内部初始化,万一第一页请求失败会导致后续res未定义报错。
修复后的代码
import requests
import json

# 提前初始化结果字典,resources设为空列表,避免循环内初始化的风险
res = {'resources': []}
i = 1
total = None
pages = 0
resto = 0

while True:
    api_url = f'{ise_url}networkdevice?size=100&page={i}'
    response = requests.get(api_url, headers=headers, data=payload)
    
    if response.status_code != 200:
        print(f"请求第{i}页失败,状态码:{response.status_code}")
        break
    
    devices = response.json()  # 直接用response.json()简化解析
    
    # 第一次请求时获取总条数和总页数
    if i == 1:
        total = devices.get('total', 0)
        pages = total // 100
        resto = total % 100
        # 追加第一页资源到总列表
        res['resources'].extend(devices.get('resources', []))
    else:
        # 后续页面直接追加资源列表
        res['resources'].extend(devices.get('resources', []))
    
    print(f"已处理第{i}页")
    i += 1
    
    # 判断循环终止条件
    max_page = pages + 1 if resto > 0 else pages
    if i > max_page:
        break

# 输出最终结果
for j in res['resources']:
    print(f"{j['id']}\t{j['name']}")
关键改动说明
  1. 提前初始化res:把res = {'resources': []}放在循环外,确保res始终有定义,初始空列表用来接收所有页面的元素。
  2. 用列表extend()合并数据:每一页的resources是列表,extend()会把当前页的所有元素追加到总列表,而非替换字典键值对。
  3. 简化响应解析:用response.json()代替手动解码和json.loads,更简洁可靠。
  4. 优化终止逻辑:提前计算最大页码max_page,避免嵌套判断,逻辑更清晰。
  5. 增加错误处理:请求失败时直接打印错误并退出,避免无效循环。

内容的提问来源于stack exchange,提问作者ZeusTM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:46:12