程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python深拷貝和淺拷貝和賦值的區別

編輯:Python

深拷貝和淺拷貝的區別

我的理解就是

賦值:這個好說,一個人叫張三,A叫他張三,B叫他張四,但都是同一個人,張四不過是他的一個外號,如果張三被打了,也就是張四被打了

深拷貝:這個也比較好理解,克隆了一個完全一模一樣的人,張三,有一個兒子張二,我們進行深拷貝,克隆出了一個張三二號,一個張二二號,張二二號是張三二號的兒子,張三被打斷了腿,張三二號是沒變化的,張二被打斷了腿,張二二號也是沒變化的,完全自主的父子

淺拷貝:介於復制和深拷貝之間的狀態,比如說張三有一個兒子張二,我把張三克隆出來了一個張三二號,但是我們還有一個共同的兒子張二,如果張三的兒子被打斷了腿,等於張三二號的兒子被打斷了腿,但是如果張三長了痔瘡或者張三被人打斷了腿,對於被克隆出來的張三二號來說,是不受影響的,這個時候就是,老子是自主的,兒子是共享的

""" @File : qianCopy.py @Contact : [email protected] @Modify Time @Author @Version ------------ ------- -------- 2022/6/16 8:47 下午 張胤 1.0 @Desciption: """
import copy
alist = [1, 2, 3, ["a", "b"]]
# 淺拷貝
blist = copy.copy(alist)
# 賦值
clist = alist
# 深拷貝
dlist = copy.deepcopy(alist)
print(alist)
print(blist)
print(clist)
print(dlist)
alist.append(4)
print(alist)
print("如果是淺拷貝,沒有拷貝子對象")
print(blist)
print("賦值,傳遞對象的引用而已,原數據怎麼變,clist怎麼變")
print(clist)
print("深拷貝,不管原數據怎麼變,dlist都不變")
print(dlist)
alist[3].append("cccc")
print(alist)
print("如果是淺拷貝,沒有拷貝子對象,所以原數據alist的子對象對變更後,淺拷貝的子對象blist的子對象也會變更")
print(blist)
print("賦值,傳遞對象的引用而已,原數據怎麼變,clist怎麼變")
print(clist)
print("深拷貝,不管原數據怎麼變,dlist都不變")
print(dlist)
dlist.append(99)
print(alist)
print(blist)
print(clist)
print("深拷貝,修改dlist也不會引起原數據的變更,就是相互獨立的")
print(dlist)
blist[3].append(101)
print("淺拷貝,修改blist的子對象,也會影響原數據的子對象")
print(alist)
print(blist)
print(clist)
print(dlist)

結果

[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b'], 4]
如果是淺拷貝,沒有拷貝子對象
[1, 2, 3, ['a', 'b']]
賦值,傳遞對象的引用而已,原數據怎麼變,clist怎麼變
[1, 2, 3, ['a', 'b'], 4]
深拷貝,不管原數據怎麼變,dlist都不變
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b', 'cccc'], 4]
如果是淺拷貝,沒有拷貝子對象,所以原數據alist的子對象對變更後,淺拷貝的子對象blist的子對象也會變更
[1, 2, 3, ['a', 'b', 'cccc']]
賦值,傳遞對象的引用而已,原數據怎麼變,clist怎麼變
[1, 2, 3, ['a', 'b', 'cccc'], 4]
深拷貝,不管原數據怎麼變,dlist都不變
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b', 'cccc'], 4]
[1, 2, 3, ['a', 'b', 'cccc']]
[1, 2, 3, ['a', 'b', 'cccc'], 4]
深拷貝,修改dlist也不會引起原數據的變更,就是相互獨立的
[1, 2, 3, ['a', 'b'], 99]
淺拷貝,修改blist的子對象,也會影響原數據的子對象
[1, 2, 3, ['a', 'b', 'cccc', 101], 4]
[1, 2, 3, ['a', 'b', 'cccc', 101]]
[1, 2, 3, ['a', 'b', 'cccc', 101], 4]
[1, 2, 3, ['a', 'b'], 99]

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved