Python:含列表值的字典转字典列表时值覆盖的原因
问题原因与解决方法
为什么最终列表里两个字典的b都是2?
因为Python里字典是可变对象,当你写tmp_dict = example时,并没有复制出一个新字典,只是让tmp_dict和example指向了内存中同一个字典对象。
第一次循环时,你修改tmp_dict["b"] = 1,其实是直接修改了原example字典,此时把它添加到列表里;第二次循环修改tmp_dict["b"] = 2,还是修改同一个原字典,再添加一次。最后列表里的两个元素都是指向同一个字典,自然显示的都是最后一次修改后的结果。
正确的实现方式
每次循环都要创建一个原字典的副本,而不是直接引用原字典:
方法1:使用字典的copy()方法
example = {"a":1,"b":[1,2]} iter_items = example.get("b") new_list = [] for p in iter_items: tmp_dict = example.copy() # 复制出一个新字典 tmp_dict["b"] = p new_list.append(tmp_dict) print(new_list) # 输出:[{"a":1,"b":1},{"a":1,"b":2}]
方法2:使用dict()构造函数创建副本
example = {"a":1,"b":[1,2]} iter_items = example.get("b") new_list = [] for p in iter_items: tmp_dict = dict(example) # 生成新字典 tmp_dict["b"] = p new_list.append(tmp_dict) print(new_list)
方法3:用字典推导式简化代码
example = {"a":1,"b":[1,2]} new_list = [{"a": example["a"], "b": p} for p in example["b"]] print(new_list)
内容的提问来源于stack exchange,提问作者akmalharith
相关产品推荐
相关产品推荐

