1、浅拷贝
1.1 不可变类型,不拷贝。
import copy
v1 = "华青水上"
print(id(v1)) # 2790670093264
v2 = copy.copy(v1)
print(id(v2)) # 2790670093264
按理说拷贝v1之后,v2的内存地址应该不同,但由于python内部优化机制,内存地址是相同的,因为对不可变类型而言,如果以后修改值,会重新创建一份数据,不会影响原数据,所以,不拷贝也无妨。
1.2 可变类型,只拷贝第一层。
import copy
v1 = ["华青水上", "root", [44, 55]]
print(id(v1)) # 2790670283272
print(id(v1[2])) # 2790670293192
v2 = copy.copy(v1)
print(id(v2)) # 2790670283656
print(id(v2[2])) # 2790670293192
2、深拷贝
2.1 不可变类型,不拷贝
import copy
v1 = "华青水上"
print(id(v1)) # 2790670548880
v2 = copy.deepcopy(v1)
print(id(v2)) # 2790670548880
特殊的元组:
- 元组元素中无可变类型,不拷贝
import copy
v1 = ("武沛齐", "root")
print(id(v1)) # 2790670581320
v2 = copy.deepcopy(v1)
print(id(v2)) # 2790670581320
- 元组元素中有可变类型,找到所有【可变类型】或【含有可变类型的元组】 均拷贝一份
import copy
v1 = ("华青水上", "root", [11, [44, 55], (11, 22), (11, [], 22), 33])
v2 = copy.deepcopy(v1)
print(id(v1)) # 2790670557336
print(id(v2)) # 2790670615000
print(id(v1[2])) # 2790670295944
print(id(v2[2])) # 2790670295752
print(id(v1[2][1])) # 2790670293256
print(id(v2[2][1])) # 2790670296584
print(id(v1[2][2])) # 2790670637128
print(id(v2[2][2])) # 2790670637128
print(id(v1[2][3])) # 2790670218008
print(id(v2[2][3])) # 2790670217528
2.1 可变类型,找到所有层级的 【可变类型】或【含有可变类型的元组】 均拷贝一份
import copy
v1 = ["华青水上", "root", [11, [44, 55], (11, 22), (11, [], 22), 33]]
v2 = copy.deepcopy(v1)
print(id(v1)) # 2790670299016
print(id(v2)) # 2790670293000
print(id(v1[2])) # 2790670296648
print(id(v2[2])) # 2790670293256
print(id(v1[2][1])) # 2790670296776
print(id(v2[2][1])) # 2790670296200
print(id(v1[2][2])) # 2790670633864
print(id(v2[2][2])) # 2790670633864
print(id(v1[2][3])) # 2790670217688
print(id(v2[2][3])) # 2790670557336
import copy
v1 = ["华青水上", "root", [44, 55]]
v2 = copy.deepcopy(v1)
print(id(v1)) # 2790670270344
print(id(v2)) # 2790670282440
print(id(v1[2])) # 2790670281096
print(id(v2[2])) # 2790670296648
至此,Python基础之深浅拷贝总结完毕,不当之处,欢迎指正!