深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B
复制了A
,修改A
的时候,看B
是否发生变化:
如果B
跟着也变了,说明是浅拷贝
,拿人手短!(修改堆内存中的同一个值)
如果B
没有改变,说明是深拷贝
,自食其力!(修改堆内存中的不同值)
浅拷贝
(shallowCopy)只是增加了一指针指向已存在的内存地址。
深拷贝
(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存
使用深拷贝
的情况下,释放内存的时候不会因为出现浅拷贝
时释放同一个内存的错误。
浅拷贝
:仅仅时指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深拷贝
:在计算机中开辟一块新的内存地址用于存放复制的对象。
但是在python中,对浅拷贝和深拷贝,还需要分数据类型是可变类型
还是不可边类型
。
可变数据类型 | 不可变数据类型 | |
---|---|---|
浅拷贝 | 只对可变类型的第一层对象进行拷贝,对拷贝的对象会开辟新的内存空间进行存储,子对象不进行拷贝 | 不会给拷贝的对象开辟新的内存空间,而只是拷贝了这个对象的引用。 |
深拷贝 | 会对该对象到最后一个可变类型的每一层对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储 | 如果子对象没有可变类型则不会进行拷贝,而只是拷贝了这个对象的引用,否则会对该对象到最后一个可变类型的每一层对象就行拷贝, 对每一层拷贝的对象都会开辟新的内存空间进行存储 |