Python字典列表更新sequenceId时实际输出与预期不符问题排查
问题原因
- 核心是Python中字典是可变对象,你从JSON加载得到的
MainNodes列表里存储的是字典的引用,后续多次调用extend(MainNodes)往FinalNodes中添加的都是同一批字典对象的引用,不是独立的新字典。 - 举例来说:假设
MainNodes长度为2,你循环10次执行extend操作,那么FinalNodes[1]、FinalNodes[3]、FinalNodes[5]一直到FinalNodes[19]本质上指向的是同一个字典对象,你给索引19的这个字典赋值sequenceId=38时,前面所有指向该对象的位置的sequenceId都会被同步修改为38,因此最后查看索引7的值会变成最后一次赋值的结果,而非索引7那次循环赋值的14。
解决方法
你只需要在extend时,对MainNodes里的每个字典做浅拷贝即可(如果字典存储的值都是数字、字符串这类不可变类型,浅拷贝完全满足需求),修改构造FinalNodes的逻辑:
#prepare final nodes FinalNodes = [item.copy() for item in FirstNode] for i in range(numberofJobs): # 每个主节点都拷贝生成新字典,避免引用共享 FinalNodes.extend([item.copy() for item in MainNodes]) FinalNodes.extend([item.copy() for item in LastNode])
修改后FinalNodes里的每个字典都是独立对象,赋值时不会互相影响,最终FinalNodes[7]['sequenceId']就能输出预期的14。
内容的提问来源于stack exchange,提问作者D_wanna_B_coder
相关产品推荐
相关产品推荐

