Python遍历JSON生成列表时结果重复25次的问题排查
问题根因
你的代码有3个核心逻辑错误:
- 字典
d定义在循环外部,属于全局复用的可变对象。Python中列表存储的是对象的引用而非拷贝,你每次循环往列表追加的都是同一个字典的内存地址,后续循环给d新增键值对时,列表里之前追加的所有元素都会同步更新,最终所有元素都会变成包含全部25组键值对的字典。 - 追加列表的逻辑放错了位置。你在每次循环里都执行一次
sizelist.append(d),循环25次自然会往列表里塞25个元素,和你「最终列表仅包含1个完整映射字典」的需求完全不符。 - 遍历写法冗余且存在变量覆盖问题:你提前计算了
jsonLength存数组长度,结果写for循环时直接把jsonLength当成循环变量用,覆盖了原有的长度值;同时额外维护forCounter手动做数组索引,完全没必要,还增加了出错概率。
修正代码
调整逻辑:循环内只负责给字典填充尺码和skuId的映射关系,等所有键值对填充完成后,再把完整的字典一次性追加到列表中即可,同时简化遍历逻辑去掉多余的计数器:
import json sizeCounter = 3.5 json_object = json.loads(json1) # 初始化尺码-skuId映射字典 size_sku_map = {} # 直接遍历数组元素,不需要手动维护索引计数器 for sku_info in json_object["skuAvailability"]: size_sku_map[sizeCounter] = sku_info["skuId"] sizeCounter += 0.5 # 所有映射组装完成后,再放入列表,仅追加1次 sizelist = [size_sku_map] print(sizelist)
补充说明:如果后续有需求需要在循环过程中保存每次迭代的字典快照,需要追加字典的浅拷贝,即写
sizelist.append(d.copy()),否则还是会出现所有元素同步变化的问题。
内容的提问来源于stack exchange,提问作者BigO
相关产品推荐
相关产品推荐

