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 13 Python
Python ldap实现登录实例代码
Sep 30 Python
微信跳一跳python代码实现
Jan 05 Python
python删除服务器文件代码示例
Feb 09 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
对python while循环和双重循环的实例详解
Aug 23 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 Python
用Python爬取某乎手机APP数据
Jun 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
PHPlet在Windows下的安装
2006/10/09 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
PHP采集类Snoopy抓取图片实例
2014/06/19 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
跟老齐学Python之折腾一下目录
2014/10/24 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
竞选学习委员演讲稿
2014/09/01 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
收入证明怎么写
2015/06/12 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL