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 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
python操作xml文件示例
Apr 07 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
如何使用flask将模型部署为服务
May 13 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
大师制作的中短波矿石收音机
2020/04/02 无线电
php获取系统变量方法小结
2015/05/29 PHP
php上传后台无法收到数据解决方法
2019/10/28 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
原生js实现验证码功能
2017/03/16 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
Python统计单词出现的次数
2018/04/04 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
解决Mac下使用python的坑
2019/08/13 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
详解python logging日志传输
2020/07/01 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
静态变量和实例变量的区别
2015/07/07 面试题
国际贸易个人求职信范文
2014/01/04 职场文书
农民工创业典型事迹
2014/01/25 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
小学数学课题方案
2014/06/15 职场文书
会计求职自荐信
2014/06/20 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏