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多进程操作实例
Nov 21 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
django加载本地html的方法
May 27 Python
浅析python的优势和不足之处
Nov 20 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
python实现kmp算法的实例代码
Apr 03 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
python文本数据处理学习笔记详解
Jun 17 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
python 字典和列表嵌套用法详解
Jun 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下统计用户在线时间的一种尝试
2010/08/26 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
javascript 简练的几个函数
2009/08/29 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
Python字符串的一些操作方法总结
2019/06/10 Python
用pycharm开发django项目示例代码
2019/06/13 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
python中元组的用法整理
2020/06/15 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
塔吉特百货公司官网:Target
2017/04/27 全球购物
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
东方通信股份有限公司VC面试题
2014/08/27 面试题
本科毕业自我鉴定
2014/03/20 职场文书
安全责任书范本
2014/04/15 职场文书
考研复习计划
2015/01/19 职场文书
MySQL约束超详解
2021/09/04 MySQL