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实现ip查询示例
Mar 26 Python
Python中运行并行任务技巧
Feb 26 Python
python编程培训 python培训靠谱吗
Jan 17 Python
Python编写一个优美的下载器
Apr 15 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
python语言基本语句用法总结
Jun 11 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
Django REST framework 单元测试实例解析
Nov 07 Python
PyQT5 emit 和 connect的用法详解
Dec 13 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
Python 多进程原理及实现
Dec 21 Python
python中requests库+xpath+lxml简单使用
Apr 29 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的无限分类实现想法~
2007/01/02 PHP
PHP时间格式控制符对照表分享
2013/07/23 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
常见的python正则用法实例讲解
2016/06/21 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
基于python log取对数详解
2018/06/08 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
python文本数据处理学习笔记详解
2019/06/17 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
最新党员的自我评价分享
2013/11/04 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
尊师重教主题班会
2015/08/14 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Nginx反向代理配置的全过程记录
2021/06/22 Servers