You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环修改二维字典键值不符合预期:原因及解决方法

问题原因与解决方案:二维字典引用共享导致的结果不符

问题原因

你初始化dict2时执行了dict2[i] = dict1,这行代码并没有为dict2的每个键创建新字典,而是把同一个dict1对象的引用赋值给了dict2['a']、dict2['b']、dict2['c']。也就是说这三个键指向内存里的同一个字典实例,后续不管修改哪个键对应的字典,都是在修改这个共享的实例,最终所有键的内容完全一致。

解决方案

要让dict2的每个键对应独立的字典,需要在循环初始化时为每个键创建新的字典对象,而非复用同一个引用。这里提供两种可行的修改方式:

方式1:循环内直接创建新字典

把初始化dict2的代码改成每次循环生成全新的内部字典:

dict2 = dict()
list1 = ['a', 'b', 'c']  # 避免用list当变量名,会覆盖Python内置的list类型
list2 = ['A', 'B', 'C']

for key in list1:
    # 每次循环生成新字典,每个键对应空列表
    dict2[key] = {k: [] for k in list2}

方式2:通过拷贝创建独立字典

如果需要基于已有的dict1结构初始化,可以用浅拷贝(你的字典值是列表,这里浅拷贝足够):

dict1 = {i: [] for i in list2}
dict2 = dict()
list1 = ['a', 'b', 'c']

for key in list1:
    # 拷贝dict1生成新实例,避免引用共享
    dict2[key] = dict1.copy()

修改后的完整代码

dict2 = dict()
list1 = ['a', 'b', 'c']
list2 = ['A', 'B', 'C']

# 初始化每个键对应独立的字典
for key in list1:
    dict2[key] = {k: [] for k in list2}

count = 0
for i in range(3):
    for j in range(3):
        dict2[list1[i]][list2[j]].append(count)
        count += 1
print(dict2)

运行后会得到预期输出:

{'a': {'A': [0], 'B': [1], 'C': [2]}, 'b': {'A': [3], 'B': [4], 'C': [5]}, 'c': {'A': [6], 'B': [7], 'C': [8]}}

内容的提问来源于stack exchange,提问作者Tea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:33:19