Python札记8_深入理解赋值和深、浅拷贝(更新)

浏览: 805

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])) # 在深拷贝中,第二层的地址也是不同的
推荐 0
本文由 皮大大 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册