python踩坑之浅拷贝和深拷贝
摘要:最近在进行数据分析时,在python对象的深浅拷贝方面,遇到了一个很低级的错误。
- 遇到的问题
代码意思很简单,把result字典添加进result_list里面,想象中的结果应该是
[{'城市':'城市63'},{'城市':'城市64'}],但是实际结果却是[{'城市':'城市64'},{'城市':'城市64'}]。原因:python中的对象就像c语言里一个指向一块内存地址的指针。可以用id(result)查看字典result的唯一标识,可以类比成result在内存中的地址。
当使用append时并没有将字典result的值拷贝过去,而是拷贝的指向这块内存地址的指针。所以当后面在对result字典进行修改的时候,自然会影响到前面已经添加进result_list列表的值。
- update方法
update方法是浅拷贝。可以看到字典d会拷贝第一层变量的值,例如字典d中的值不会和字典f有关系。而字典g的值得变化会影响字典d的值。
- append方法
可以看到列表k的值受到q的影响。
- dict.fromkeys方法
可以看到dict.fromkeys方法返回的ret字典受到a列表的影响。
深拷贝和浅拷贝方法
- 深拷贝
- 浅拷贝
python中=赋值语句
- 赋值相当于重新创建了一个新的变量,可以看到id(a)函数返回值不一样
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。