深浅拷贝拷贝的例子,还是自己复习归纳一遍比较好,虽然很久之前C++以及JAVA都有学习到,这里就用最近常用的Python来理解一遍吧。
浅拷贝,就是对当前对象的引用进行的一个拷贝,当引用发生改变时,原来的对象也会发生改变。
而深拷贝不一样,深拷贝是对当前对象的值重新分配一块内存空间,当对象改变时,深拷贝的值并没有进行改变。
浅拷贝:
>>> ls = [1,2,3,4,5]
>>> c_ls = ls
>>> ls[0]=0
>>> c_ls
[0, 2, 3, 4, 5]
>>> id(c_ls) == id(ls)
True
这里我们进行的就是浅拷贝,等于是对列表的对象的引用进行了拷贝,在C++中也就是对当前内存重新申请了指针,但是这个指针指向的是已经存在的内存。而深拷贝不一样,深拷贝是为被赋值的对象重新申请了一块内存。
深拷贝:
>>> ls = [1,[2,3]]
>>> c_ls = ls
>>> import copy
>>> c2_ls = copy.deepcopy(ls)
>>> ls[1].append(4)
>>> c_ls
[1, [2, 3, 4]]
>>> c2_ls
[1, [2, 3]]
但是这里要注意切片,序列对象的切片其实是浅拷贝,即只拷贝顶级的对象。深拷贝只有一种形式,copy模块中的deepcopy函数。和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。