嵌套for循环中字典值被覆盖,如何获取正确的更新字典列表?
问题原因与解决办法
你遇到的问题核心是字典是可变对象——你循环里操作的是fruit_lst里的原字典,每次update都是在修改同一个字典实例,end_lst里添加的只是这个字典的"引用"(可以理解为指向同一个东西的指针)。所以不管你append多少次,最后所有条目指向的都是被最后一次修改(Green)的那几个字典。
要解决这个问题,关键是每次循环时创建新的字典对象,而不是修改原字典。下面给你几种可行的写法:
方法1:字典解包创建新字典
直接把原字典的内容和新的color键值对合并成一个新字典:
end_lst = [] color_lst = ['Blue','Red','Purple','Green'] fruit_lst = [{'fruit':'apple'}, {'fruit':'pear'}, {'fruit':'mango'}] for color in color_lst: for fruit in fruit_lst: # 用字典解包生成新字典,不修改原fruit new_fruit = {**fruit, 'color': color} end_lst.append(new_fruit) print(end_lst)
方法2:复制原字典后修改
先复制原字典,再给副本添加color键,这样修改的是副本,不影响原字典:
end_lst = [] color_lst = ['Blue','Red','Purple','Green'] fruit_lst = [{'fruit':'apple'}, {'fruit':'pear'}, {'fruit':'mango'}] for color in color_lst: for fruit in fruit_lst: # 复制原字典得到新对象 fruit_copy = fruit.copy() fruit_copy.update({'color': color}) end_lst.append(fruit_copy) print(end_lst)
方法3:用列表推导式简化代码
如果想写得更简洁,可以用嵌套的列表推导式,一步生成目标列表:
color_lst = ['Blue','Red','Purple','Green'] fruit_lst = [{'fruit':'apple'}, {'fruit':'pear'}, {'fruit':'mango'}] end_lst = [{**fruit, 'color': color} for color in color_lst for fruit in fruit_lst] print(end_lst)
上面三种方法都能得到你想要的结果:每个水果对应每种颜色的独立字典条目,不会被后续循环覆盖。
内容的提问来源于stack exchange,提问作者Meme-ento
相关产品推荐
相关产品推荐

