本文以Python3以上为学习基础。
目录
浅拷贝1:直接赋值
直接上实例,看看下面的现象:
我把a直接赋值给b。
我们通过 id() 查看对象在内存中的位置。
可以看到,在a和b在内存中的位置一模一样。
相同的原理,字典的赋值依旧是一样的现象。内存中的位置没有发生改变。
这个就是所谓的:浅拷贝。
我们直白的看看下面这张图:
浅拷贝2:copy()函数
下面我们看看copy()。
第一步:In[181]:我通过copy函数把字典tmp拷贝给tmp1。
第二步:In[182]:利用remove()函数把字典tmp1的键'a'的值中的2给移除出去。
第三步:In[183]:我们查看字典tmp之内。发现tmp居然发生了改变。
我们看看两个字典tmp和tmp1在内存中的位置:
很明显 字典tmp 和 字典tmp1 是两个位置。但是为什么我 remove 掉 tmp1 中 键a 的 值2 ,为什么 tmp 也改变了呢?
我们再看一个示例。
第一步:我通过copy函数把字典tmp拷贝给tmp1。
第二步:修改tmp1中 键b 的 值
第三步:查看 字典tmp 的内容。
很明显:这时候tmp没有改变。
我们看看两操作之间的区别:
第一次copy操作的对象是键值对:'a':[1,2,3]
第二次copy操作的对象是键值对:'b':2
区别:
- 第一次操作的对象 键a 的值是列表[1,2,3]。
- 第二次操作的对象 键b 的值是一个int类型的2
最根本原因:
和python存储的数据类型特点有关,python只存储基本类型的数据,比如int类型,str类型,对于非基础类型的,比如上例中 字典键a 的值是列表 (上例中的tmp1的键a),python不会在copy之后的对象中(上例中的tmp1)重新存储,而是用引用的方式,指向原来的值。
一句话就是:不会拷贝对象的内部的子对象。而是用引用的方式,指向原来的值。
深拷贝:deepcopy()
注意:使用深拷贝函数deepcopy()需要导入模块:import copy
第一步:进行深拷贝
第二步:利用remove()函数把字典tmp1的键'a'的值中的2给移除出去。
第三步:查看tmp的内容
结论:很明显,tmp没有发生任何改变。
以上所谓浅拷贝和深拷贝。希望对你有所帮助。
如果有错误,欢迎指正。