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

Python字典update方法工作原理及两种实现差异解惑

问题:字典更新后添加到列表与新建字典添加的结果差异原因及解决办法

代码对比示例

以下是两种方式的完整测试代码:

myjson1={}
myJsonArray1=[]
myjson2={}
myJsonArray2=[]
print('###方式1:update后添加###')
for x in range(1,4):
    myjson1.update({'posnr':x})
    myJsonArray1.append(myjson1)
print(myJsonArray1)
print('###方式2:新建字典后添加###')
for x in range(1,4):
    myjson2={'posnr':x}
    myJsonArray2.append(myjson2)
print(myJsonArray2)

用户尝试的代码(方式1)

for x in range(1,4):
    myjson1.update({'posnr':x})
    myJsonArray1.append(myjson1)

输出结果:[{'posnr': 3}, {'posnr': 3}, {'posnr': 3}]

期望实现的代码(方式2)

for x in range(1,4):
    myjson2={'posnr':x}
    myJsonArray2.append(myjson2)

输出结果:[{'posnr': 1}, {'posnr': 2}, {'posnr': 3}]

原因解析

Python里的字典是可变对象,方式1中myjson1是同一个字典对象,每次调用update()只是修改这个对象内部的键值对,而列表myJsonArray1中添加的都是这个字典对象的引用。循环结束后,这个字典的posnr被最后一次更新为3,所以列表里的所有元素指向的都是这个最终状态的字典,导致输出全是3。

而方式2中,每次循环都用myjson2={'posnr':x}新建一个字典对象,列表里的每个元素都是独立的字典引用,彼此互不影响,所以能得到依次递增的结果。

解决方案

在循环内部每次初始化新的字典,确保每次添加到列表的都是不同的字典对象:

myJsonArray1=[]
for x in range(1,4):
    myjson1={}  # 每次循环新建字典
    myjson1.update({'posnr':x})
    myJsonArray1.append(myjson1)
print(myJsonArray1)

运行后输出:[{'posnr': 1}, {'posnr': 2}, {'posnr': 3}],和方式2的结果一致。

内容的提问来源于stack exchange,提问作者Troy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:08