Python循环中list.append()数据被覆盖的原因与修复

Theo
Theo
发布时间:2026-10-13 | 2人浏览过
原创

本文分析Python爬虫中常见错误:在循环外定义字典并多次调用list.append(),导致列表中所有元素指向同一内存地址,最终值被最后一次循环覆盖。通过将字典初始化移至循环内部,确保每次迭代创建新对象,从而正确保存所有数据。

前言

最近在一次爬虫实战中,我发现了一个有趣的现象:试图将字典对象添加到列表中时,结果与预期不符。下面对这一异常情况进行简要分析。

list = []
dic = {}
for i in range(5):
 dic['num'] = i
 list.append(dic)
 print(id(dic))
print(list)
136652096
136652096
136652096
136652096
136652096
[{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]

实际输出结果出乎意料,并非我们直观认为的那样。

[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]

基于我的理解,出现这种情况的原因如下:

如上图所示,虽然列表中的每个元素看似都分配了一个位置,但由于字典dic是在循环外部定义的,每次循环append()操作实际上是将同一个对象的内存地址存入列表。当dic的值在后续循环中被修改时,列表中之前存储的引用所指向的数据也会随之改变,导致最终获取的值全部被最后一次循环的值覆盖。

正确的处理方法是:

list = []
for i in range(5):
 dic = {}
 dic['num'] = i
 list.append(dic)
 print(id(dic))
print(list)
138383888
136652192
138383408
138384272
138383792
[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]

应将字典dic的初始化操作放入循环内部。这样,每次循环都会创建一个新的字典对象,并分配不同的内存地址,从而确保列表中的每个元素都能独立保存各自的数据。

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对本站的支持。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表