Python循环中list.append()数据被覆盖的原因与修复
本文分析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的初始化操作放入循环内部。这样,每次循环都会创建一个新的字典对象,并分配不同的内存地址,从而确保列表中的每个元素都能独立保存各自的数据。
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









