一、简单解释
- 浅拷贝属于顶层拷贝,只拷贝最外层,里面如果有列表还是指向原来的的地址,如果子列表发生改变,拷贝的内容也发生改变
- 深拷贝: 深拷贝属于递归拷贝,递归创建新的内存地址,原来发生改变拷贝的内容不发生改变
二、简单示例
- 浅拷贝:
- 原对象的list元素改变的话会改变当前对象,如果当前对象中list元素改变了,也同样会影响原对象。
- a与b的指向的是一个内存地址,c地址中存放着a与b的值,所以当a中元素变了,b的也跟着变了
- 深拷贝:
- 深拷贝就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象
- a和b是分配了两块内存地址的,所以互不影响
三、可变类型与不可变类型
- 引用 在Python程序中,每个对象都会在内存中申请开辟一块空间来保存该对象,该对象在内存中所在位置的地址被称为引用。在开发程序时,所定义的变量名实际就对象的地址引用。
引用实际就是内存中的一个数字地址编号,在使用对象时,只要知道这个对象的地址,就可以操作这个对象,但是因为这个数字地址不方便在开发时使用和记忆,所以使用变量名的形式来代替对象的数字地址。 - 可变对象指一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值;
int,float,complex,long,str,unicode,tuple
- 不可变对象指一个对象所指向的地址上值是不能修改的,
如果你修改了这个对象的值,那么它指向的地址就改变了,
相当于你把这个对象指向的值复制出来一份,
然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,
而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址。-
四、深拷贝和浅拷贝需要注意的地方是可变元素的拷贝
:
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
五、为什么Python默认的拷贝方式是浅拷贝?
-
时间角度
:浅拷贝花费时间更少; -
空间角度
:浅拷贝花费内存更少; -
效率角度
:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。