摘要:最近在进行数据分析时,在python对象的深浅拷贝方面,遇到了一个很低级的错误。

    1. 遇到的问题

      浅拷贝和深拷贝1.jpg

      代码意思很简单,把result字典添加进result_list里面,想象中的结果应该是
      [{'城市':'城市63'},{'城市':'城市64'}],但是实际结果却是[{'城市':'城市64'},{'城市':'城市64'}]。

      原因:python中的对象就像c语言里一个指向一块内存地址的指针。可以用id(result)查看字典result的唯一标识,可以类比成result在内存中的地址。

      当使用append时并没有将字典result的值拷贝过去,而是拷贝的指向这块内存地址的指针。所以当后面在对result字典进行修改的时候,自然会影响到前面已经添加进result_list列表的值。

    2. update方法
      update方法是浅拷贝。

      浅拷贝和深拷贝2.jpg

      可以看到字典d会拷贝第一层变量的值,例如字典d中的值不会和字典f有关系。而字典g的值得变化会影响字典d的值。

    3. append方法

      浅拷贝和深拷贝3.jpg

      可以看到列表k的值受到q的影响。

    4. dict.fromkeys方法

      浅拷贝和深拷贝4.jpg

      可以看到dict.fromkeys方法返回的ret字典受到a列表的影响。

    5. 深拷贝和浅拷贝方法

      • 深拷贝

      浅拷贝和深拷贝5.jpg

      • 浅拷贝

      浅拷贝和深拷贝6.jpg

    6. python中=赋值语句

      • 赋值相当于重新创建了一个新的变量,可以看到id(a)函数返回值不一样

      浅拷贝和深拷贝7.jpg