黑马程序员技术交流社区

标题: 使用遍历在列表中添加字典 [打印本页]

作者: 全论坛最帅ID    时间: 2018-7-30 22:56
标题: 使用遍历在列表中添加字典
已知列表L = [{"key": 5}, {"key": 9}, {"key": -1},定义一个函数,将该列表按照其元素的value值进行排序,并输出结果。思路:新建一个列表,然后遍历取出字典的值加入到新的列表中,再通过遍历,赋值字典,使用append方法一次添加到列表,这样就是一个按照value值排列
代码:
L =[{"key":9}, {"key"}:5, {"key":-1}]
list1 = []
list2 = []
dict = {}
def demo():
    for i in L:
        list1.append(i["key"])
    list1.sort()
    for i in list1:
        dict["key"] = i
        list2.append(dict)
    return list2
result = demo()
print(result)
运行结果却是:[{"key":9},{"key":9},{"key":9}]
很明显,取值被最后一个传入value的9全部替换了.为什么会这样呢?开始怀疑是不是和字典中重复赋值给"key"有关,但是也不应该啊,每次遍历的时候就是已经把字典append到list中去了啊!
于是使用print(id(dict)),查看内存信息,发现这个现象:
31034176
31034176
31034176
居然都是同一地址!!再查看list2中的每个元素地址:
结果:(print(id(dict))也打印了)
34507584
34507584
34507584
34507584
34507584
34507584
于是明白了,因为每次添加的都是同一个内存到list中去了,dict每次写入的时候改变了内存中的value,但是地址不变,即是,创建了一次内存空间,只会不断的改变value了.完善方法:每次遍历时候创建一个新的dict
更改后代码:
L =[{"key":9}, {"key"}:5, {"key":-1}]
list1 = []
list2 = []
def demo():
    for i in L:
        list1.append(i["key"])
    list1.sort()
    for i in list1:
        dict = {}
        dict["key"] = i
        list2.append(dict)
    return list2
result = demo()
print(result)


作者: 郑成功    时间: 2018-7-31 09:59
哇塞,这道题我最近也遇到到过,一直没想出来。谢谢楼主了!!!
么么哒




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2