python中的深拷貝和淺拷貝理解

2021-06-22 06:11:23 字數 2294 閱讀 4469

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用。以下分兩個思路來分別理解淺拷貝和深拷貝:

1、利用切片操作和工廠方法list方法拷貝

**場景:有乙個小伙jack,tom通過切片操作拷貝jack,anny通過工廠方法拷貝jack。

>>> jack = ['jack', ['age', 20]]

>>> tom = jack[:]

>>> anny = list(jack)

來看下三者的id值:

>>> print id(jack), id(tom), id(anny)

144846988 144977164 144977388

從id值來看,三者是不同的物件。為tom和anny重新命名為各自的名稱:

>>> tom[0] = 'tom'

>>> anny[0] = 'anny'

>>> print jack, tom, anny

['jack', ['age', 20]] ['tom', ['age', 20]] ['anny', ['age', 20]]

從這裡來看一切正常,可是anny只有18歲,重新為anny定義歲數。

>>> anny[1][1] = 18

>>> print jack, tom, anny

['jack', ['age', 18]] ['tom', ['age', 18]] ['anny', ['age', 18]]

這時候奇怪的事情發生了,jack、tom、anny的歲數都發生了改變,都變成了18了。jack、tom、anny他們應當都是不同的物件,怎麼會互相影響呢?看下jack,tom,anny的內部元素每個元素id:

>>> [id(x) for x in jack]

[3073896320l, 3073777580l]

>>> [id(x) for x in tom]

[144870744, 3073777580l]

>>> [id(x) for x in anny]

[144977344, 3073777580l]

恍然大悟,原來jack、tom、anny的歲數元素指向的是同乙個元素。修改了其中乙個,當然影響其他人了。那為什麼修改名稱沒影響呢?原來在python中字串不可以修改,所以在為tom和anny重新命名的時候,會重新建立乙個』tom』和』anny』物件,替換舊的』jack』物件。為了便於理解,我畫了乙個草圖:

python淺拷貝**

2、利用copy中的deepcopy方法進行拷貝

為了讓他們之間不互相影響,用deepcopy來試試

>>> jack = ['jack', ['age', '20']]

>>> import copy

>>> tom = copy.deepcopy(jack)

>>> anny = copy.deepcopy(jack)

根據第乙個思路進行重新命名,重定歲數操作:

>>> tom[0] = 'tom'

>>> anny[0] = 'anny'

>>> print jack, tom, anny

['jack', ['age', '20']] ['tom', ['age', '20']] ['anny', ['age', '20']]

>>> anny[1][1] = 18

>>> print jack, tom, anny

['jack', ['age', '20']] ['tom', ['age', '20']] ['anny', ['age', 18]]

這時候他們之間就不會互相影響了。列印出每個人的內部元素每個id:

>>> [id(x) for x in jack]

[139132064, 3073507244l]

>>> [id(x) for x in tom]

[139137464, 139132204]

>>> [id(x) for x in anny]

[139141632, 139157548]

他們的內部元素也都指向了不同的物件。

小結:

思路一:利用切片操作和工廠方法list方法拷貝就叫淺拷貝,只是拷貝了最外圍的物件本身,內部的元素都只是拷貝了乙個引用而已。

思路二:利用copy中的deepcopy方法進行拷貝就叫做深拷貝,外圍和內部元素都進行了拷貝物件本身,而不是引用。

但是對於數字,字串和其他原子型別物件等,沒有被拷貝的說法,即便是用深拷貝,檢視id的話也是一樣的,如果對其重新賦值,也只是新建立乙個物件,替換掉舊的而已。

python中的淺拷貝和深拷貝

不得不說 python核心程式設計 是一本好書,看到其中一節做一下隨筆。在python中,當建立乙個物件後,然後把它賦給另乙個物件時,python並沒有去拷貝這個物件,而是拷貝了這個物件的引用。看不懂沒關係,我們看乙個例子。raw list first second 12 32 copy list ...

python中的深拷貝和淺拷貝

淺拷貝 copy 不拷貝物件的內容,僅僅拷貝子物件的引用 深拷貝 deepcopy 會連同拷貝子物件的記憶體,對子物件的修改不會影響源物件 下面用 來測試 import copy deftest copy 淺拷貝測試 a 10 20,5,6 b copy.copy a print a a,end t...

python中的淺拷貝和深拷貝

本篇介紹下python中的深拷貝和淺拷貝,主要從基本型別 類 不可變型別等方面進行介紹。1.介紹拷貝之前首先應該明白is和 的區別,即is表示同乙個物件,比較的是值 a 1000 b 1000 a b true a is bfalse class person object def init sel...