在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...