Python嵌套字典更新异常:修改内部字典值时所有条目同步变更
解决Python嵌套字典内部字典同步更新的问题
嘿,这个坑我之前踩过好多次!你遇到的问题核心是字典推导式里所有内部字典都指向同一个内存对象,而非每个键对应独立的字典副本。
问题原因拆解
看你这段代码:
d_main ={i : d_int for i in range(len(arr))}
这里的d_int是一个提前创建好的字典对象,推导式只是把这个对象的引用重复赋值给了d_main的每个键。所以不管你修改d_main[0]['a']还是d_main[1]['i'],本质都是在修改同一个d_int字典,所有条目自然会同步变化。
几种可行的解决方法
你只需要在推导式里为每个键创建新的字典副本,而非复用同一个引用,这里有几种常用实现方式:
方法1:使用字典的copy()方法
修改推导式,每次循环时复制d_int:
arr = [1,2] d_int = {'a':False, 'e':False, 'i':False, 'o':False, 'u':False} d_main ={i : d_int.copy() for i in range(len(arr))} # 新增copy()创建副本 print(d_main) d_main[0]['a'] = True d_main[1]['i'] = True print(d_main)
方法2:用字典解包快速创建新字典
通过{**d_int}的语法快速生成新字典:
d_main ={i : {**d_int} for i in range(len(arr))}
方法3:直接在推导式内定义内部字典
如果d_int的结构固定,也可以直接把字典定义写进推导式,彻底避免外部引用问题:
d_main ={i : {'a':False, 'e':False, 'i':False, 'o':False, 'u':False} for i in range(len(arr))}
修改后的运行结果
执行修改后的代码,就能得到你期望的输出:
{0: {'a': False, 'e': False, 'i': False, 'o': False, 'u': False}, 1: {'a': False, 'e': False, 'i': False, 'o': False, 'u': False}} {0: {'a': True, 'e': False, 'i': False, 'o': False, 'u': False}, 1: {'a': False, 'e': False, 'i': True, 'o': False, 'u': False}}
内容的提问来源于stack exchange,提问作者Itachi
相关产品推荐
相关产品推荐

