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
相关产品推荐
相关产品推荐

