浅拷贝:
是指复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程
示例:
l = [3.1,3.2]
l1=[1,2,l]
是指复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程
示例:
l = [3.1,3.2]
l1=[1,2,l]
# l1=[1,2,[3.1,3.2]]
l2=l1.copy() #浅拷贝
l2=l1.copy() #浅拷贝
#l2=[1,2,[3.1,3.2]]
l[0]=3.14
l[0]=3.14
# l=[3.14,3.2]
# l1=[1,2,[3.14,3.2]]
# l2=[1,2,[3.14,3.2]]
l1[0]=5
# l1=[1,2,[3.14,3.2]]
# l2=[1,2,[3.14,3.2]]
l1[0]=5
# l1=[5,2,[3.14,3.2]]
l2=[1,2,[3.14,3.2]]
# l1[2]和l2[2]共同拥有l的绑定关系
l2=[1,2,[3.14,3.2]]
# l1[2]和l2[2]共同拥有l的绑定关系
深拷贝:
是指复制过程中,复制深层变量绑定的对象的复制过程
示例:
import copy # 导入copy模块
l = [3.1,3.2]
l1=[1,2,l] # l1=[1,2,[3.1,3.2]]
l2=copy.deepcopy(l1) #深拷贝 l2=[1,2,[3.1,3.2]]
l[0]=3.14 # l=[3.14,3.2]
# l1=[1,2,[3.14,3.2]]
# l2=[1,2,[3.1,3.2]] 此列表不受影响
l1=[1,2,l] # l1=[1,2,[3.1,3.2]]
l2=copy.deepcopy(l1) #深拷贝 l2=[1,2,[3.1,3.2]]
l[0]=3.14 # l=[3.14,3.2]
# l1=[1,2,[3.14,3.2]]
# l2=[1,2,[3.1,3.2]] 此列表不受影响
注意事项:
深拷贝通常只对可变对象进行深层复制,不可变对象通常不会被复制
理解:
import copy # 导入复制模块
l1=[1,2,[3.1,3.2]]
l2=l1 # l1和l2绑定的是同一个对象
l3=l1.copy() # 浅拷贝
l4=copy.deepcopy(l1) # 深拷贝
l1[2][0]=3.14 # 把3.1改为3.14
深拷贝和浅拷贝的复制过程中是不会对(对象)进行拷贝对象的id不会改变,如: id(l4[0])id(l4[1])中的1,2 不会改变
但是其他的id 会改变 , 如:id(l4[2])中的[3.1,3.2]这个列表的id 改变了
以上可用 id()验证