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实现抓取城市的PM2.5浓度和排名
Mar 19 Python
Python中scatter函数参数及用法详解
Nov 08 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
python3 拼接字符串的7种方法
Sep 12 Python
基于Python在MacOS上安装robotframework-ride
Dec 28 Python
创建Django项目图文实例详解
Jun 06 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
Python itertools.product方法代码实例
Mar 27 Python
python实现斗地主分牌洗牌
Jun 22 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
python3操作redis实现List列表实例
Aug 04 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 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
杏林同学录(七)
2006/10/09 PHP
使用php来实现网络服务
2009/09/15 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
Destoon模板制作简明教程
2014/06/20 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
快速了解python leveldb
2018/01/18 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
员工培训邀请函
2014/02/02 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
购房委托书
2014/10/15 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
python实现MD5进行文件去重的示例代码
2021/07/09 Python
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL
python运算符之与用户交互
2022/04/13 Python