Python循环处理嵌套字典子项时出现非预期输出如何解决?
问题成因
dict.fromkeys 方法传入的第二个默认值如果是可变对象(字典、列表、DataFrame等)时,不会为每个key单独创建独立的副本,而是所有key共享同一个对象的内存引用。你示例中所有ticker对应的子字典本质上是同一个字典,循环修改时每一次赋值都会覆盖上一次的结果,最终所有子字典的值都等于最后一次循环的赋值结果3。你实际场景中存储DataFrame出现覆盖,也是同样的原因:所有子字典引用的是同一个内存地址,最后一次写入的DataFrame自然会覆盖之前所有的写入结果。
修复方案
初始化字典时不要用dict.fromkeys传入可变默认值,改用字典推导式为每个key单独生成独立的子字典:
ticker = ["a","bb","ccc"] # 字典推导式会为每个key创建新的子字典,互相独立 ticker_dict = {key: {"Var": []} for key in ticker} for key in ticker_dict: ticker_dict[key]["Var"] = len(key)
运行后即可得到预期结果:
{"a":{"Var":1}, "bb":{"Var":2}, "ccc":{"Var":3}}
如果你要存储DataFrame,只要按照同样的逻辑初始化每个key对应的独立存储容器即可,不会再出现覆盖问题。
相关检索指引
站内同类问题可通过以下关键词搜索:
- Python dict.fromkeys 可变对象 引用
- Python 字典赋值覆盖 可变对象
- Python 可变对象 初始化 共享引用
内容的提问来源于stack exchange,提问作者Jan Felix
相关产品推荐
相关产品推荐

