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的Django框架中自定义模版标签的示例
Jul 20 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
python实现教务管理系统
Mar 12 Python
python绘制中国大陆人口热力图
Nov 07 Python
深入了解Django中间件及其方法
Jul 26 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
keras输出预测值和真实值方式
Jun 27 Python
Python用来做Web开发的优势有哪些
Aug 05 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
php 小乘法表实现代码
2009/07/16 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
python爬虫之遍历单个域名
2019/11/20 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
仓库组长岗位职责
2014/01/29 职场文书
银行服务感言
2014/03/01 职场文书
说明书格式及范文
2014/05/07 职场文书
服务承诺口号
2014/05/22 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
2016党校培训心得体会
2016/01/07 职场文书
导游词之太原天龙山
2020/01/02 职场文书
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技