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 collections模块实例讲解
Apr 07 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
使用Python对Excel进行读写操作
Mar 30 Python
回调函数的意义以及python实现实例
Jun 20 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
python2与python3共存问题的解决方法
Sep 18 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
Jan 10 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
python基础学习之递归函数知识总结
May 26 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 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
BBS(php & mysql)完整版(二)
2006/10/09 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
一端时间轮换的广告
2006/06/26 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
美国现代家具购物网站:LexMod
2019/01/09 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
董事长致辞
2015/07/29 职场文书
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js