浅谈python中copy模块的copy()方法和deepcopy()方法的区别。。浅拷贝和深拷贝
copy() VS deepcopy()
第一步:实验
根据上述代码可知 目前b,c都得到了a的值 。。 接着往下看
上述代码,我们给a[0]赋了100。 输出发现只有a中的值改变。。b 和c 都没改变 。。 说明b, c缺失把a中的值复制了一份,不是指复制了索引。。这句话其实有点问题 。。 接着往下看
上述代码:我们把a列表中第三个元素(列表)第一个值改变了。赋值为shawroa。。 此时输出,我们发现a ,b中的那个位置的值发生了变化,而c则没变。。
总结:
注意:
- copy对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象。对于子对象,python会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。
- deepcopy的时候会将复杂对象的每一层复制一个单独的个体出来
在继承中的区别(自己建两个类试一下,有时间补上):
浅拷贝: copy模块的copy方法, 拷贝父对象,不会拷贝对象的内部的子对象。即浅复制只复制对象本身,没有复制该对象所引用的对象。
深拷贝:copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。即创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。