‘=’ 一般意义的复制
我们所说的一般意义的“等于号“相当于引用,即原始队列改变,被赋值的队列也会作出相同的改变。
直接赋值,传递对象的引用而已,原始列表改变,被赋值的队列也会做相同的改变
temp = [1,2,[3,4]]
print("temp:",temp)
temp2 = temp
print("temp2:",temp2)
temp.append(5)
print(temp,temp2)
temp[2].append(6)
print(temp,temp2)
浅拷贝copy
copy是浅拷贝,并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改
变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。
这里需要注意,对于简单对象来说,深拷贝、浅copy并没有区分,改变原始队列,赋值队列并不会改变。
但是对于嵌套队列来说,改变了子对象的值,浅拷贝会随之变化,深拷贝不会。
import copy
temp = [1,2,[3,4]]
print(temp)
temp2 = copy.copy(temp)
print(temp2)
temp.append(5)
print(temp,temp2)
temp[2].append(6)
print(temp,temp2)
深拷贝 deepcopy
Python中的copy动作,对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序
列,字典里的嵌套序列等都是复杂对象的子对象。
对于子对象,浅拷贝动作会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用
将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。
对于子对象,深拷贝动作会将复杂对象的每一层复制一个单独的个体出来,因而二者完全独立。
import copy
temp = [1,2,[3,4]]
temp2 = copy.deepcopy(temp)
print(temp,temp2)
temp.append(5)
print(temp,temp2)
temp[2].append(6)
print(temp,temp2)
总结:
1. 直接赋值:其实就是对象的引用(别名)。
2.浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
3.深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
1、b = a: 赋值引用,a 和 b 都指向同一个对象。
2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。