循环修改二维字典键值不符合预期:原因及解决方法
问题原因与解决方案:二维字典引用共享导致的结果不符
问题原因
你初始化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
相关产品推荐
相关产品推荐

