如何向列表内嵌字典的列表追加元素并解决多字典共享列表问题
问题根因
该问题由Python的浅拷贝特性+可变对象引用共享共同导致:
- 模板字典
personStats中的OtherItems是列表类型,属于Python可变对象。你使用的dict.copy()是浅拷贝操作,仅会复制字典的顶层键值对,嵌套的可变对象不会生成新的独立实例,所有通过模板拷贝生成的用户字典,其OtherItems字段都指向内存中的同一个列表对象。因此对任意一个用户的OtherItems执行追加操作,所有用户的该字段都会同步变更。 - 你最初版本的
updatePersonItem还存在逻辑错误:判断物品是否重复时查询的是模板字典的personStats["OtherItems"],而非当前匹配到的用户的OtherItems,即便修正该逻辑,只要浅拷贝的问题未解决,仍会出现所有用户列表一致的问题。
修复方案
从创建用户的根源逻辑修改即可,可选两种实现方式:
方案1:使用深拷贝生成独立用户字典
导入copy模块的deepcopy接口,拷贝模板时会自动递归复制所有嵌套的可变对象,保证每个用户的OtherItems都是独立列表:
import copy import re personList = [] personStats = {"Name": "", "MainItem": "", "OtherItems": []} def addPerson(name): if not any(d["Name"] == name for d in personList): # 替换原浅拷贝为深拷贝 personStatsCopy = copy.deepcopy(personStats) personStatsCopy.update({"Name": name}) personList.append(personStatsCopy)
方案2:手动构造用户字典,避免共享模板引用
直接为每个新用户生成独立的字典结构,完全绕开模板拷贝的引用问题:
def addPerson(name): if not any(d["Name"] == name for d in personList): personStatsCopy = { "Name": name, "MainItem": "", "OtherItems": [] } personList.append(personStatsCopy)
修复后你原本的updatePersonItem逻辑无需额外调整即可正常运行,你之前的临时方案本质是通过每次生成新列表赋值给新字段,绕过了共享列表的问题,从根源解决拷贝问题后代码可维护性更高。
内容的提问来源于stack exchange,提问作者crkn213
相关产品推荐
相关产品推荐

