Python列表排序陷阱:字典引用导致值被覆盖的解决方案
本文分析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))
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。如果你想了解更多相关内容请查看下面相关链接
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













