美文网首页
列表添加字典类型元素的问题

列表添加字典类型元素的问题

作者: Koreyoshier | 来源:发表于2017-09-30 16:34 被阅读206次

最近在用Python进行爬虫解析时,遇到一个比较恼人的bug,归根结底是对Python中的深浅拷贝理解不够透彻。在这里记录下来以供将来查阅。

首先放一段代码:这段代码的功能是遍历列表中的元素对字典键值对中的值依次修改并将新的字典添加到dic_list这个列表中。

    dic_list = []
    lis = [1, 2, 3]
    dic = {}
    for ele in lis:
        dic["a"] = 1
        dic["b"] = 2
        dic["c"] = ele
        print dic
        dic_list.append(dic)
    print dic_list

输出结果为:

{'a': 1, 'c': 1, 'b': 2}
{'a': 1, 'c': 2, 'b': 2}
{'a': 1, 'c': 3, 'b': 2}
[{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]

可以看到,每次输出的字典确实被改变了,但是添加新的字典后得到的字典列表却和预期的输出结果不一样,它包含的3个字典元素一模一样。这是怎么回事呢?

原因在于Python中的一切数据类型皆为object,不管是primitive types(int, float, str, bool)还是dict,list,tuple。在添加到列表中时,实际上添加的是指向该字典的引用。而Python中,字典是可变的,在字典被改变后,指向该字典的引用所对应的内容也会改变,所以得到的dic_list中的字典都是第3次循环得到的字典。可以通过添加两条语句得到我们想要的结果:

dic_list = []
lis = [1, 2, 3]
dic = {}
for ele in lis:
     dic["a"] = 1
     dic["b"] = 2
     dic["c"] = ele
     new_dic = dic.copy()
     dic_list.append(new_dic)
print dic_list

输出结果为:

[{'a': 1, 'c': 1, 'b': 2}, {'a': 1, 'c': 2, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]

其中,copy()方法用于返回字典的浅拷贝。至于深浅拷贝,等有时间再做整理~

相关文章

  • Python  C1-5——list.append()及输出

    在字典类型中定义字典,列表类型中用append方法在列表后依次添加元素,用for循环输出列表和字典中的元素...

  • 列表添加字典类型元素的问题

    最近在用Python进行爬虫解析时,遇到一个比较恼人的bug,归根结底是对Python中的深浅拷贝理解不够透彻。在...

  • Python零基础4:列表、字典、元组

    数据类型:列表 什么是列表 从列表中提取单个元素 从列表中提取多个元素 给列表增加/删除元素 数据类型:字典 什么...

  • day9 函数基础

    一、函数、字典、列表集合的区别 列表,字典,元祖,集合"""列表(list): [];可变,有序;元素是任何类型的...

  • Python基础(14) - 如何使用Lambda表达式进行排序

    如果列表元素是字典类型,使用lambda进行升序排列 创建一个列表中含有字典的元素 使用sorted(a,key=...

  • 2018-10-10day9-总结

    一、容器类型复习 列表,字典,元祖,集合 列表(list): [];可变,有序;元素是任何类型的数据增:列表.ap...

  • 11总 文件和异常捕获

    复习: 容器类型:字典、列表、元祖、集合 1.列表:有序(可以通过下标获取元素)、可变(增删改)、列表中的元素可以...

  • April 28th_day11_functionAsX

    record 1.容器型数据类型:列表、元素、字典、集合 1.1.列表 [元素1,元素2,……]可变、有序增删改查...

  • swift基础语法(字典)

    字典的 Key类型必须遵循 Hashable协议,就像合集的值类型。 1、定义字典 2、创建空字典 3、添加元素 ...

  • Python ch3

    组合数据类型 列表 元组 字典 集合 列表list 是一种有序的集合,可以随时添加和删除其中的元素 用索引来访问l...

网友评论

      本文标题:列表添加字典类型元素的问题

      本文链接:https://www.haomeiwen.com/subject/blsfextx.html