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批量下载图片的三种方法
Apr 22 Python
python通过正则查找微博@(at)用户的方法
Mar 13 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
Python循环语句中else的用法总结
Sep 11 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
python使用正则筛选信用卡
Jan 27 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
使用turtle绘制五角星、分形树
Oct 06 Python
python实现超级马里奥
Mar 18 Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 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
Zend Framework入门应用实例详解
2016/12/11 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
JS中sort函数排序用法实例分析
2016/06/16 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
python解析xml文件实例分析
2015/05/27 Python
Python的re模块正则表达式操作
2016/05/25 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
美国时尚在线:Showpo
2017/09/08 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
资深财务管理人员自我评价
2013/09/22 职场文书
经济信息管理专业大学生求职信
2013/09/27 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
环卫工人慰问信
2015/02/15 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
公司放假通知范文
2015/04/14 职场文书
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
python解析照片拍摄时间进行图片整理
2022/07/23 Python