Python中有深拷贝与浅拷贝的概念,以下是根据个人理解整理,如有错误欢迎指出。
一、准备
1、如下代码,创建两个类A和B
class A:
pass
class B:
pass
2、创建需要两个参数传入的类AB
class AB:
def __init__(self, a_, b_):
self.a = a_
self.b = b_
二、创建对象实例
分别创建A、B、AB的对象实例,其中AB实例化时将A、B的实例化对象a、b作为参数传入
a = A()
b = B()
ab = AB(a, b)
三、对象内存分析
- 创建类对象后,会开辟内存分别存储三个类对象的相关信息(id、type、value)。Ps:此处id为假设并非实际id值。
- 对象实例化后,也就是执行A()、B()、AB() 后,会对应开辟内存,存储实例化对象相关信息,并有类指针各自指向自己的类对象。
- 经过赋值语句,创建变量存储实例化对象的id值以指向实例化对象。
- 引入其他类实例对象的参数指向引用对象(红色虚线、蓝色虚线),作为其子对象。
四、浅拷贝
import copy
ab1 = copy.copy(ab)
浅拷贝时,直接拷贝新的实例对象,开辟了新的内存(有新的id),然后定义变量ab1 存储其id值,指向新拷贝的实例对象。
但对象引用其他实例对象指向不变,如下图。
五、深拷贝
ab2 = copy.deepcopy(ab)
深拷贝时,在拷贝父对象的同时,拷贝子对象(引入的实例对象),如下图所示。
拷贝时开辟新的内存。并且,拷贝后的value指向改变,如下图。
六、总结
浅拷贝:只拷贝当前实例对象,不改变其子对象指向(ps:一个人的变动)
深拷贝:拷贝时同时拷贝其引用子对象,指向拷贝的新对象(ps:一家人的变动)