当前位置:脚本大全 > > 正文

python列表的循环遍历使用教程(Python中使用遍历在列表中添加字典遇到的坑)

时间:2022-01-21 00:27:30类别:脚本大全

python列表的循环遍历使用教程

Python中使用遍历在列表中添加字典遇到的坑
  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • """
  • 已知列表li = [{"key": 5}, {"key": 9}, {"key": -1}, {"key": 4}] ,
  • 定义一个函数,将该列表按照其元素的value
  • 值进行排序,并输出结果
  • """
  • 思路很清晰,新建一个列表,然后遍历取出字典的值加入到新的列表中,再通过遍历,赋值字典,使用append方法依次添加到列表,这样就是一个按照value值排续.于是有了下面的代码:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 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中的每个元素地址:

  • ?
  • 1
  • 2
  • 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.

    代码:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 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))
  • 总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。如果你想了解更多相关内容请查看下面相关链接

    原文链接:https://blog.csdn.net/wu0che28/article/details/79924360

    上一篇下一篇

    猜您喜欢

    热门推荐