You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何向列表添加新字典时,列表中原有字典会同步变更?

列表中字典同步变更的原因与解决办法

你遇到的问题核心是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:52:42