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

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

本文分析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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。