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中列表元素连接方法join用法实例
Apr 07 Python
用Python编写web API的教程
Apr 30 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
python中的字典使用分享
Jul 31 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
python字符串下标与切片及使用方法
Feb 13 Python
postman和python mock测试过程图解
Feb 22 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
PHP中cookies使用指南
2007/03/16 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
PHP中session变量的销毁
2014/02/27 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
js图片预加载示例
2014/04/30 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Tornado 多进程实现分析详解
2018/01/12 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
python获取linux系统信息的三种方法
2020/10/14 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
2014年会演讲稿范文
2014/01/06 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
项目投资意向书
2014/04/01 职场文书
公司股权转让协议书
2014/04/12 职场文书
三国演义读书笔记
2015/06/25 职场文书
毕业感言怎么写
2015/07/31 职场文书