Python淺拷貝與深拷貝
討論import copy
中copy.copy
與copy.deepcopy
區(qū)別。
根據(jù)官方文檔所述葵第,這兩種復(fù)制區(qū)別僅與復(fù)雜對象有關(guān),復(fù)雜對象可以理解為嵌套了另一個數(shù)據(jù)類型邮弹,比如字典中包含列表泰鸡。
簡單數(shù)據(jù)類型
不可變類型
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
無論深淺拷貝孩锡,變量整體地址都發(fā)生了改變酷宵。但是其中元素地址并沒有變化。
復(fù)雜數(shù)據(jù)類型
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
結(jié)果與簡單數(shù)據(jù)類型中可變類型結(jié)論一樣躬窜。
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
無論深淺拷貝變量整體地址都發(fā)生了變化浇垦。如果是淺拷貝嵌套的對象地址不變,如果是深拷貝嵌套的對象地址發(fā)生改變荣挨。
初學(xué)python男韧,如對知識點理解有誤還請指正。歡迎補充不足之處默垄,看到后我會及時補充進文章中此虑。