Python札记呆鸟的Python数据分析大数据,机器学习,人工智能

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

2019-06-18  本文已影响1人  皮皮大

Python中有一个很特殊的现象:深浅拷贝,看到一些面经里面很多面试都会考到这个知识点,将笔者自己的理解整理如下

深浅拷贝

对于字符串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]))  # 在深拷贝中,第二层的地址也是不同的

上一篇 下一篇

猜你喜欢

热点阅读