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']}")
关键改动说明
- 提前初始化
res:把res = {'resources': []}放在循环外,确保res始终有定义,初始空列表用来接收所有页面的元素。 - 用列表
extend()合并数据:每一页的resources是列表,extend()会把当前页的所有元素追加到总列表,而非替换字典键值对。 - 简化响应解析:用
response.json()代替手动解码和json.loads,更简洁可靠。 - 优化终止逻辑:提前计算最大页码
max_page,避免嵌套判断,逻辑更清晰。 - 增加错误处理:请求失败时直接打印错误并退出,避免无效循环。
内容的提问来源于stack exchange,提问作者ZeusTM
相关产品推荐
相关产品推荐

