Python浅拷贝与深拷贝
讨论import copy
中copy.copy
与copy.deepcopy
区别。
根据官方文档所述,这两种复制区别仅与复杂对象有关,复杂对象可以理解为嵌套了另一个数据类型,比如字典中包含列表。
简单数据类型
不可变类型
a = 100
print("a原始地址:%d" % id(a))
b = copy.copy(a)
print("b浅拷贝地址:%d" % id(b))
c = copy.deepcopy(a)
print("c深拷贝地址:%d" % id(c))
输出:
a原始地址:140734756253424
b浅拷贝地址:140734756253424
c深拷贝地址:140734756253424
对于不可变类型,无论深浅拷贝地址都没有变化。
可变类型
list_a = [1, 2, 3]
print("list_a原始地址:%d" % id(list_a))
print("list_a中元素地址:%d" % id(list_a[0]))
list_b = copy.copy(list_a)
print("list_b浅拷贝地址:%d" % id(list_b))
print("list_b中元素地址:%d" % id(list_b[0]))
list_c = copy.deepcopy(list_a)
print("list_c深拷贝地址:%d" % id(list_c))
print("list_c中元素地址:%d" % id(list_c[0]))
输出:
list_a原始地址:2492188109000
list_a中元素地址:140734229209744
list_b浅拷贝地址:2492188207944
list_b中元素地址:140734229209744
list_c深拷贝地址:2492188206728
list_c中元素地址:140734229209744
无论深浅拷贝,变量整体地址都发生了改变。但是其中元素地址并没有变化。
复杂数据类型
dic_list_a = {"1": "a", "2": "b", "3": [1, 2, 3]}
print("dic_list_a原始地址:%d" % id(dic_list_a))
print("dic_list_a元素地址:%d" % id(dic_list_a["1"]))
dic_list_b = copy.copy(dic_list_a)
print("dic_list_b浅拷贝地址:%d" % id(dic_list_b))
print("dic_list_b元素地址:%d" % id(dic_list_b["1"]))
dic_list_c = copy.deepcopy(dic_list_a)
print("dic_list_c深拷贝地址:%d" % id(dic_list_c))
print("dic_list_c元素地址:%d" % id(dic_list_c["1"]))
输出:
dic_list_a原始地址:2863672895384
dic_list_a元素地址:2863672765048
dic_list_b浅拷贝地址:2863672895816
dic_list_b元素地址:2863672765048
dic_list_c深拷贝地址:2863674603992
dic_list_c元素地址:2863672765048
结果与简单数据类型中可变类型结论一样。
dic_list_a = {"1": "a", "2": "b", "3": [1, 2, 3]}
print("dic_list_a原始地址:%d" % id(dic_list_a))
print("dic_list_a元素地址:%d" % id(dic_list_a["3"]))
dic_list_b = copy.copy(dic_list_a)
print("dic_list_b浅拷贝地址:%d" % id(dic_list_b))
print("dic_list_b元素地址:%d" % id(dic_list_b["3"]))
dic_list_c = copy.deepcopy(dic_list_a)
print("dic_list_c深拷贝地址:%d" % id(dic_list_c))
print("dic_list_c元素地址:%d" % id(dic_list_c["3"]))
输出:
dic_list_a原始地址:2435944785816
dic_list_a元素地址:2435974948360
dic_list_b浅拷贝地址:2435944786248
dic_list_b元素地址:2435974948360
dic_list_c深拷贝地址:2435974937048
dic_list_c元素地址:2435974948296
无论深浅拷贝变量整体地址都发生了变化。如果是浅拷贝嵌套的对象地址不变,如果是深拷贝嵌套的对象地址发生改变。
初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。