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 yield 使用浅析
May 28 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Pycharm学习教程(1) 定制外观
May 02 Python
python字符串过滤性能比较5种方法
Jun 22 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
基于Python正确读取资源文件
Sep 14 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的配置文件php.ini
2006/10/09 PHP
php for 循环语句使用方法详细说明
2010/05/09 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
基于python实现高速视频传输程序
2019/05/05 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
东方电视购物:东方CJ
2016/10/12 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
Python面试题集
2012/03/08 面试题
代码中finally中的代码会不会执行
2012/02/06 面试题
初中校园广播稿
2014/02/02 职场文书
三查三看党性分析材料
2014/02/18 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
违纪检讨书
2015/01/27 职场文书
大学生村官入党自传
2015/06/26 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python