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小程序分享
Dec 05 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
Python简单实现控制电脑的方法
Jan 22 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
Python3如何判断三角形的类型
Apr 12 Python
python解决12306登录验证码的实现
Apr 18 Python
Python 文字识别
May 11 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
Symfony核心类概述
2016/03/17 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
重载toString实现JS HashMap分析
2011/03/13 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
python 文件操作删除某行的实例
2017/09/04 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
python plotly画柱状图代码实例
2019/12/13 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
教育科学研究生自荐信
2013/10/09 职场文书
开业庆典答谢词
2014/01/18 职场文书
大学生未来职业生涯规划书
2014/02/15 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
CentOS安装Nginx并部署vue
2022/04/12 Servers
Go语言怎么使用变长参数函数
2022/07/15 Golang