Python浅拷贝与深拷贝

Python浅拷贝与深拷贝

讨论import copycopy.copycopy.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,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。

你可能感兴趣的:(Python浅拷贝与深拷贝)