Python中有一个很特殊的现象:
深浅拷贝
,看到一些面经里面很多面试都会考到这个知识点,将笔者自己的理解整理如下
深浅拷贝
-
浅拷贝:copy(),拷贝第一层
-
深拷贝:deepcopy(),拷贝所有数据(可变);存在嵌套时,才和浅拷贝有区别
对于字符串str
、整数型int
、布尔值bool
三种不可变的对象类型,深浅拷贝是一样的,直接在内存中直接开辟空间进行存储。
对于列表list、集合set、字典dict:
单层列表
V1 = [1, 2, 3]
V2 = copy.copy(V1)
V3 = copy.deepcopy(V1) # 找到所有的可变数据类型进行拷贝;V1中只有列表是可变,其中的int类型是不可变的;所以V2和V3相同
print(V2, V3)
[1, 2, 3] [1, 2, 3]
V1 = "xiaoming"
V2 = copy.copy(V1)
print(id(V1), id(V2)) # 内存地址本应该不同,但结果中却是相同,是由于小数据池的缘故;因为列表是不可变的对象类型
V3 = copy.deepcopy(V1)
print(id(V1), id(V3)) # 原理同上
V1 = [1, 2, [3, 4]]
V2 = copy.copy(V1)
print(id(V1), id(V2)) # 内存地址不同,列表是可变数据类型
V3 = copy.deepcopy(V1) # 存在嵌套:浅拷贝只拷贝第一层,深拷贝里面的所有数据进行拷贝
print(id(V1), id(V3)) # 内存地址不同
V1 = [1, 2, [3, 4]]
V2 = copy.copy(V1)
print(id(V1), id(V2)) # 浅拷贝只拷贝第一层,内存地址不同;
print(id(V1[2]), id(V2[2])) # 第二层的地址是相同的
V3 = copy.deepcopy(V1) # 存在嵌套:浅拷贝只拷贝第一层,深拷贝里面的所有数据进行拷贝
print(id(V1), id(V3)) # 内存地址不同
print(id(V1[2]), id(V3[2])) # 在深拷贝中,第二层的地址也是不同的
网友评论