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 01 Python
python获取图片颜色信息的方法
Mar 18 Python
python 爬虫出现403禁止访问错误详解
Mar 11 Python
Python实现的质因式分解算法示例
May 03 Python
情人节快乐! python绘制漂亮玫瑰
Aug 18 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
基于python-pptx库中文文档及使用详解
Feb 14 Python
python模拟点击网页按钮实现方法
Feb 25 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
详解Python flask的前后端交互
Mar 31 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
js模块加载方式浅析
2017/08/12 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
js实现导航跟随效果
2018/11/17 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
python中from module import * 的一个坑
2014/07/20 Python
python插入排序算法实例分析
2015/07/03 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
专题组织生活会方案
2014/06/15 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
小学毕业感言200字
2015/07/30 职场文书
诚信教育主题班会
2015/08/13 职场文书