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 相关文章推荐
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
Django restframework 源码分析之认证详解
Feb 22 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
对python中各个response的使用说明
Mar 28 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
python 视频下载神器(you-get)的具体使用
Jan 06 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 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
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
PHP+MYSQL的文章管理系统(二)
2006/10/09 PHP
第十三节--对象串行化
2006/11/16 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
php array的学习笔记
2012/05/16 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
获取url中用&隔开的参数实例(分享)
2017/05/28 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
Python复制目录结构脚本代码分享
2015/03/06 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
Python实现画图软件功能方法详解
2020/07/28 Python
Python 忽略文件名编码的方法
2020/08/01 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
安全环保演讲稿
2014/08/28 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书