Python中的淺拷貝與深拷貝

2022-05-06 16:12:09 字數 1939 閱讀 3612

在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。

先從乙個示例看起:

anndy = ['anndy', ['age', 24]]

tom = anndy[:]

cindy = list(anndy)

>>> id(anndy)

>>> id(tom)

>>> id(cindy)

執行結果如下:

由此可見,是建立了三個不同的物件。但是事實真的是這樣嗎?讓我們修改一下名字和年齡看看:

tom[0] = 'tom'

cindy[0] = 'cindy'

print anndy, tom, cindy

執行結果如下:

['anndy', ['age', 24]] ['tom', ['age', 24]] ['cindy', ['age', 24]]

修改年齡沒有任何問題。我們再來修改一下tom的年齡,修改為12歲:

tom[1][1] = 12

print anndy, tom, cindy

執行結果如下:

['anndy', ['age', 12]] ['tom', ['age', 12]] ['cindy', ['age', 12]]

哇喔,所有人的年齡都被修改了。這真是恐怖啊,並不是我們想要的結果。為啥會是這樣呢?我們可以列印一下列表中各個物件的id看一下:

print [id(x) for x in anndy]

print [id(x) for x in tom]

print [id(x) for x in cindy]

執行結果如下:

[6003744, 35336880]

[35426032, 35336880]

[35365376, 35336880]

由此可見,第二個列表的元素是相同的。這是為什麼呢?

原因就是淺拷貝。

構造方法或切片 [:] 做的是淺拷貝(即拷貝了最外層容器,副本中的元素是原容器中元素的引用)。如果所有元素都是不可變的(比如名字字串,修改的時候會重新建立物件,僅僅包括原子物件的元組也屬於這種情況),那麼這樣沒有問題,還能節省記憶體。但是,如果有可變的元素,可能就會導致意想不到的問題,正如剛剛,修改乙個人的年齡,所有人的年齡都發生了變化。

那麼現在來看一下深拷貝。深拷貝,顧名思義,深層次的拷貝,不僅僅拷貝最外層容器,還會拷貝容器中的元素。這是利用copy中的deepcopy方法來實現的。

實現如下:

import copy

anndy = ['anndy', ['age', 24]]

tom = copy.deepcopy(anndy)

cindy = copy.deepcopy(anndy)

tom[0] = 'tom'

cindy[0] = 'cindy'

tom[1][1] = 12

print anndy, tom, cindy

print [id(x) for x in anndy]

print [id(x) for x in tom]

print [id(x) for x in cindy]

執行結果如下:

['anndy', ['age', 24]] ['tom', ['age', 12]] ['cindy', ['age', 24]]

[34970656, 35511712]

[35570608, 35541360]

[35496448, 35541440]

ok,僅僅是tom的年齡被修改了。另外,還是需要注意一下,對於不可變的物件,比如字串,比如包括原子物件的元組,對其深拷貝不會進行

淺拷貝與深拷貝的原理你深入理解了嗎?

python 中的拷貝 淺拷貝與深拷貝

0.序列指什麼?序列型別是指容器內的元素從0開始的索引順序訪問,一次可以訪問乙個或者多個元素,包括字串 string 元組 tuple 列表 list the difference between tuple and list tuple would not be changed,but list ...

python中淺拷貝與深拷貝

淺拷貝,拷貝的是父物件,不會拷貝到內部的子物件。單從乙個淺字就可以看出他拷貝的東西不深,可以理解為只拷貝一層 import copy a 1,ss 2,3 b copy.copy a print b print id a print id b 現在有乙個列表a裡面有數字,字串,列表和字典 用淺拷貝的...

Python中的淺拷貝與深拷貝

1.淺拷貝 情況1的例項如下 import copy a 1,2 b 3,4 c a,b 注意這裡的c就是乙個可變物件!d copy.copy c print 變數c c print print 變數d d 結果 變數c 1,2 3,4 變數d 1,2 3,4 原因分析 需要拷貝的物件c是乙個lis...