Python中使用遍历在列表中添加字典遇到的坑


Posted in Python onFebruary 27, 2019
"""
已知列表li = [{"key": 5}, {"key": 9}, {"key": -1}, {"key": 4}] ,
定义一个函数,将该列表按照其元素的value
值进行排序,并输出结果
"""

思路很清晰,新建一个列表,然后遍历取出字典的值加入到新的列表中,再通过遍历,赋值字典,使用append方法依次添加到列表,这样就是一个按照value值排续.于是有了下面的代码:

li = [{"key": 5}, {"key": 9}, {"key": -1}, {"key": 4}]
def fun(li):
  li_1 = [] # 接收value值
  li_2 = [] # 接收新的字典
  dict_1 = {}
  for i in range(len(li)):
    li_1.append(li[i]["key"])
  li_1.sort() # 排序
  for i in li_1:
    dict_1["key"] = i
    print(dict_1)
    li_2.append(dict_1)
  return li_2
print(fun(li))

但是运行的结果却是:

[{'key': 9}, {'key': 9}, {'key': 9}, {'key': 9}]

很明显,取值被最后一个传入value的9全部替换了.为什么会这样呢?

开始怀疑是不是和字典中重复赋值给"key"有关,但是也不应该啊,每次遍历的时候就是已经把字典append到list中去了啊!

于是使用print(id(dict_1)),查看内存信息,发现这个现象:

2874566784272
2874566784272
2874566784272
2874566784272

居然都是同一地址!!再查看list中的每个元素地址:

for i in li_2:
print(id(i))

结果:(print(id(dict_1))也打印了)

2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944

于是明白了,因为每次添加的都是同一个内存到list中去了,dict_1每次写入的时候改变了内存中的value,但是地址不变,即是,创建了一次内存空间,只会不断的改变value了.完善方法:每次遍历时候创建一个新的dict_1.

代码:

def fun(li):
  li_1 = []
  li_2 = []
  for i in range(len(li)):
    li_1.append(li[i]["key"])
  li_1.sort() # 排序
  for i in li_1:
dict_1 = {} # 每次遍历时创建一个新的内存
    dict_1["key"] = i
    li_2.append(dict_1)
  return li_2
print(fun(li))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python实现dnspod自动更新dns解析的方法
Feb 14 Python
Python实现生成简单的Makefile文件代码示例
Mar 10 Python
python定时执行指定函数的方法
May 27 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
python 返回列表中某个值的索引方法
Nov 07 Python
Python实现Event回调机制的方法
Feb 13 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
如何学习Python time模块
Jun 03 Python
python turtle绘图命令及案例
Nov 23 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 #Python
详解Django-restframework 之频率源码分析
Feb 27 #Python
Python的UTC时间转换讲解
Feb 26 #Python
Python逐行读取文件中内容的简单方法
Feb 26 #Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 #Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 #Python
初探利用Python进行图文识别(OCR)
Feb 26 #Python
You might like
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
php反弹shell实现代码
2009/04/22 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vue-cli常用设置总结
2018/02/24 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
python实现用户登录系统
2016/05/21 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
给女朋友的道歉信
2014/01/10 职场文书
大学生的创业计划书就该这么写
2014/01/30 职场文书
社区健康教育工作方案
2014/06/03 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
医德医风学习心得体会
2016/01/25 职场文书
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers