Python中循环后使用list.append()数据被覆盖问题的解决

yipeiwu_com7年前Python基础

前言

最近发现一个问题,在一次爬虫实战中,需要将字典加入列表中,意外的情况出现了!!!下面简单分析一下出现的状况:

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都给list一个位置,但你的dic在循环外,也就说每次循环你给的都是一个地址,dic的值改变,新一次的循环值就会覆盖上一次循环的值,list取到的值也改变。

正确做法:

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放入循环内,这样每次循环都会是一个新的dic,分配不同的地址。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对【听图阁-专注于Python设计】的支持。

相关文章

python初学者,用python实现基本的学生管理系统(python3)代码实例

这个是用python实现的基本的增删改查的学生管理系统吧,其中主要是对输入的数据进行合法性检测的问题,这次又对函数进行了练习!掌握函数更加熟练了!二话不说先贴代码,一切问题请看注释,都很...

Python处理json字符串转化为字典的简单实现

今天一个朋友给个需求: 来来 {'isOK': 1, 'isRunning': None, 'isError': None} 怎么转换成字典 好,一看就是json转化很简单,开始:...

详解python里使用正则表达式的全匹配功能

详解python里使用正则表达式的全匹配功能 python中很多匹配,比如搜索任意位置的search()函数,搜索边界的match()函数,现在还需要学习一个全匹配函数,就是搜索的字符与...

python实现的一个p2p文件传输实例

考虑到我手上的服务器逐渐的增多,有时候需要大规模的部署同一个文件,例如因为方便使用systemtap这个工具定位问题,需要把手上几百台服务器同时安装kernel-debuginfo这个包...

Python pygorithm模块用法示例【常见算法测试】

本文实例讲述了Python pygorithm模块用法。分享给大家供大家参考,具体如下: pygorithm:一个用纯粹python编写的Python模块,用于纯粹的教育目的。只需导入所...