一、浅拷贝:copy.copy
copy对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象。对于子对象,python会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。
1)元组形式:
import copy a=[1,2,3] b=[4,5,6] c=(a,b) e=copy.copy(c) print(c[0])#[1, 2, 3] print(e[0])#[1, 2, 3] a.append(4) print(c[0])#[1, 2, 3, 4] print(e[0])#[1, 2, 3, 4] print(id(c))#61398072 print(id(e))#61398072 print(c is e)#True
可以看到:e和c是指向了同一个地址
列表形式:
import copy a=[1,2,3] b=[4,5,6] c=[a,b] e=copy.copy(c) print(c[0])#[1, 2, 3] print(e[0])#[1, 2, 3] a.append(4) print(c[0])#[1, 2, 3, 4] print(e[0])#[1, 2, 3, 4] print(id(c))#51304688 print(id(e))#51304768 print(c is e)#False
可以看到:c和e指向了不同的地址,但是c和e里面的内容是指向了相同的地址
2)深拷贝:
deepcopy的时候会将复杂对象的每一层复制一个单独的个体出来,deep copy 更加符合我们对「复制」的直觉定义: 一旦复制出来了,就应该是独立的了。如果我们想要的是一个字面意义的「copy」,那就直接用 deep_copy 即可
元组形式:
import copy a=[1,2,3] b=[4,5,6] c=(a,b) e=copy.deepcopy(c) print(c[0])#[1, 2, 3] print(e[0])#[1, 2, 3] a.append(4) print(c[0])#[1, 2, 3, 4] print(e[0])#[1, 2, 3] print(id(c))#61132032 print(id(e))#66655976 print(c is e)#False
列表形式:
import copy a=[1,2,3] b=[4,5,6] c=[a,b] e=copy.deepcopy(c) print(c[0])#[1, 2, 3] print(e[0])#[1, 2, 3] a.append(4) print(c[0])#[1, 2, 3, 4] print(e[0])#[1, 2, 3] print(id(c))#52553888 print(id(e))#52553968 print(c is e)#False
c和e指向了不同的地址,但是c和e里面的内容也指向了不相同的地址