主要记录一下,Python中的深拷贝和浅拷贝以及它们之间的区别。
赋值
在此之前,我们首先归纳下赋值操作,这对后面的理解很有帮助。
1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址。
2.修改不可变对象(str、tuple)需要开辟新的空间
3.修改可变对象(list等)不需要开辟新的空间
区别
这里主要介绍,直接赋值、浅拷贝(copy)以及深拷贝(deepcopy)的区别。
####直接赋值
其实就是对象的引用。
b=a的操作实际上是b引用a对象的地址,将来a的值变化了,b也会跟着变化。
浅拷贝(copy)
还是上面的例子,当b对a进行浅拷贝时,这时候b并未引用a的地址,而是重新在内存中开辟了一块空间。如下图所示:
可以看出,a和b是一个独立的对象,指向内存中不同的地址。实际上,深拷贝也是如此,区别在于子对象上,浅拷贝的子对象还是指向统一对象,再看下面的例子:
这个例子的a和b就相当于c的子对象,虽然d在浅拷贝c的过程中,重新申请了一块空间,但是子对象a和b还是指向原来的地址。没有往更深层次进行拷贝。
深拷贝(deepcopy)
其实,通过上面的例子,已经可以知道,深拷贝,在浅拷贝的基础上对里面所有的子孙对象都进行了更深层次的拷贝。(我们也称之为递归拷贝)。因此,不再赘述。
备注:copy.copy(浅拷贝)和copy.deepcopy(深拷贝)都位于copy模块下。