Python中使用遍历在列表中添加字典遇到的坑
Python  /  管理员 发布于 7年前   199
"""已知列表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_2print(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_2print(fun(li))
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家的支持。如果你想了解更多相关内容请查看下面相关链接
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号