为何向列表添加新字典时,列表中原有字典会同步变更?
列表中字典同步变更的原因与解决办法
你遇到的问题核心是Python中可变对象的引用传递机制,具体拆解如下:
问题原因
Python里的字典属于可变对象,这类对象在赋值、追加到列表时,传递的不是对象本身的副本,而是指向该对象的内存引用。
你的原代码里,temp_dict是在循环外创建的单个字典对象:
temp_dict ={} # 只创建一次,内存中只有这一个字典
每次循环里你只是修改这个字典的键值对(temp_dict[key] = dict[key]),并没有生成新的字典。当你把temp_dict追加到info列表时,列表里存的全是同一个字典的引用——相当于列表里的每个元素都是指向同一个内存地址的指针。所以每次修改temp_dict,列表里所有“看起来是不同字典”的元素,其实都是在看同一个对象的变化,自然会同步更新。
而temp_dict = dict这种写法,是让temp_dict每次循环都指向当前的dict1/dict2/dict3对象(也就是循环里的每个独立字典),相当于每次都换了一个新的引用目标,所以追加到info里的是不同对象的引用,彼此之间就不会互相影响了。
其他解决途径
除了temp_dict = dict,还有几种更稳妥的方式,本质都是每次生成新的字典对象,避免复用同一个引用:
1. 循环内新建临时字典
把temp_dict的初始化放到循环内部,每次循环都创建一个全新的空字典:
dict1 = {"Name":"Maria", "Age":"22"} dict2 = {"Name":"Ryley", "Age":"23"} dict3 = {"Name":"Helen", "Age":"24"} all_dicts = [dict1, dict2, dict3] info = [] for dict_item in all_dicts: temp_dict = {} # 每次循环都生成新字典 for key in dict_item: temp_dict[key] = dict_item[key] info.append(temp_dict)
2. 使用字典的copy()方法
直接调用字典的copy()方法生成浅拷贝,省去手动遍历的步骤:
for dict_item in all_dicts: temp_dict = dict_item.copy() # 创建当前字典的浅拷贝 info.append(temp_dict)
如果你的字典里有嵌套的可变对象(比如字典里套字典),需要用copy模块的deepcopy做深度拷贝:
from copy import deepcopy for dict_item in all_dicts: temp_dict = deepcopy(dict_item) info.append(temp_dict)
3. 用字典推导式生成新字典
一行代码完成字典的复制,简洁高效:
for dict_item in all_dicts: temp_dict = {k: v for k, v in dict_item.items()} info.append(temp_dict)
4. 直接用列表推导式生成目标列表
连临时变量都可以省掉,直接生成最终的info列表:
info = [item.copy() for item in all_dicts] # 或者用字典推导式 info = [{k: v for k, v in item.items()} for item in all_dicts]
内容的提问来源于stack exchange,提问作者TheParable
相关产品推荐
相关产品推荐

