Python中使用遍历在列表中添加字典遇到的坑

yipeiwu_com6年前Python基础
"""
已知列表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 peewee 使用经验

本文使用案例是基于 python2.7 实现 以下内容均为个人使用 peewee 的经验和遇到的坑,不会涉及过多的基本操作。所以,没有使用过 peewee,可以先阅读文档 正确性和覆盖面...

Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同。因为我是搭配 MySQL InnoDB 使用,所以使用其他数据库的也不能完全照搬本文。...

基于Pycharm加载多个项目过程图解

基于Pycharm加载多个项目过程图解

这篇文章主要介绍了基于Pycharm加载多个项目过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天在使用Pycharm工具练...

Python脚本暴力破解栅栏密码

今天遇到一个要破解的栅栏密码,先给大家介绍通用的脚本。 方法一(通用脚本): #!/usr/bin/env python # -*- coding: gbk -*- # -*-...

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

详解用pyecharts Geo实现动态数据热力图城市找不到问题解决

pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。 本文主要是用pycharts中的Geo绘制中...