Python学习【第3篇】:Python_ 深浅拷贝
Python:深浅拷贝
1. str / int / bool
#内存中开辟空间,将值取出来,两者地址不同(注意小数据池)
a = "alex"
b = copy.copy(a)
c = copy.deepcopy(a)
#两份地址
b==a==c
2. List / Set / dict
# v1 = [1,2,3]
#
# v2 = copy.copy(v1) #将第一层的空壳拷贝一份,里面元素地址一样(与v1中元素地址一样),没有新开辟内存
# print(id(v1),id(v2)) #不一样
# v3 = copy.deepcopy(v1) #将v1中所有的可变类型数据拷贝(新建)一份,不可变类型跟浅拷贝一样,没有新开辟内存
# print(v1 is v3)
# print(id(v1),id(v3)) #不一样
# v1 = [1,2,[33,99]]
# #浅拷贝只拷贝了最外层
# v2 = copy.copy(v1) # 将第一层的空壳拷贝一份,里面的数据都是指向v1中数据的内存
# print(id(v1),id(v2)) # 不一样
# print(id(v1[2]),id(v2[2])) # 一样
#
# #深拷贝:拷贝嵌套层次中的所有可变类型
# v3 = copy.deepcopy(v1) # 将v1中所有的可变类型数据拷贝(新建)一份,里面可变类型元素的地址不一样,不可变类型跟浅拷贝一样,新开辟了内存
# print(id(v1),id(v2)) # 不一样
# print(id(v1[2]),id(v2[2])) # 不一样
3. 练习题
v1 = [1,2,3,{33,99}] #可变数据类型 dict、list、set
v2 = copy.deepcopy(v1)
print(v1 == v2) #True
print(v1 is v2) #False
print(v1[0] is v2[0]) #True
print(v1[3] == v2[3]) #True
print(v1[3] is v2[3]) #False
4. 特殊情况
# #特殊情况:如果tuple里面有可变类型,那么深拷贝时会重新创建一份
# 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,[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)
v1[1] = 99
for i in v1:
print(i,end=' ') # 1 99 3 4
print()
for i in v2:
print(i,end=' ') # 1 2 3 4
- 总结:深浅拷贝都不能拷贝不可变数据类型,浅拷贝只拷贝最外层(相当于只拷贝一层),深拷贝拷贝所有嵌套层次的可变类型。

浙公网安备 33010602011771号