Python关于深拷贝和浅拷贝的理解
一.浅拷贝
a = 1000
b = a
此时即为浅拷贝,a变量和b变量的id相同
浅拷贝只是将要拷贝内容的引用传给b,即a和b此时指的是同一块内存地址上的内容。
二.深拷贝
1)copy.deepcopy()
import copy
a=[1,2,3]
b=[4,5,6]
c=[a,b]
d=copy.deepcopy(c)
此时通过查看id发现,c和d的id并不相同
#向a中加入元素
a.append(7)
#此时c=[[1,2,3,7],[4,5,6]] d=[[1,2,3],[4,5,6]]
发现当给a列表添加元素时,c变化,d不变
上例就是深拷贝。深拷贝会将要拷贝对象的内容、包括要拷贝对象内其他对象的引用所指向的对象一起拷贝(如果有引用,就根据引用找到内容进行拷贝,不会拷贝引用,只拷贝内容),就相当于深度优先算法,将其中所有内容拷贝到新的内存地址,不会受原对象的影响。
2)copy.copy()
在导入copy包后发现还有一个方法copy.copy()
import copy
a=[1,2,3]
b=[4,5,6]
c=[a,b] #c写为列表
d=(a,b) #d写为元组
e=copy.copy(c)
f=copy.copy(d)
此时通过查看id发现,e和c的地址不同,f和d的地址相同
#向a中加入元素
a.append(7)
#此时c=[[1,2,3,7],[4,5,6]] e=[[1,2,37],[4,5,6]] f=([1,2,37],[4,5,6])
发现当给a列表添加元素时,c和e和f都发生变化
经过上例和查阅书籍发现,copy.copy()方法在拷贝不可修改类型的数据时,作用就相当于浅拷贝,即f直接指向d的内存地址;在拷贝可修改类型时,作用就相当于之拷贝一层的deepcopy(),只是将c中存储的a和b的引用拷贝过来,放到新的内存地址中,并不会更深层的拷贝a和b的内容。因此,向a中添加元素,因为e中有a的引用,所以e也会发生变化。
补充:
不可变类型:整型、字符串、元组、
可变类型:列表、字典、集合