Python深拷貝與淺拷貝的區別

2022-05-13 20:05:02 字數 2036 閱讀 4092

說說python中深拷貝與淺拷貝的區別?

答:python中如果需要拷貝物件,需要使用標準庫中的copy模組。而說到copy模組,不得不說的就是深拷貝與淺拷貝。

深拷貝和淺拷貝需要注意的地方就是:可變元素的拷貝

在淺拷貝時,拷貝出來的新物件的位址和原物件是不一樣的,但是新物件裡面的可變元素(如列表)的位址和原物件裡的可變元素的位址是相同的。也就是說淺拷貝它拷貝的是淺層次的資料結構(不可變元素),物件裡的可變元素作為深層次的資料結構並沒有被拷貝到新位址裡面去,而是和原物件裡的可變元素指向同乙個位址,所以在新物件或原物件裡對這個可變元素做修改時,兩個物件是同時改變的。但是深拷貝不會這樣,這個是淺拷貝相對於深拷貝最根本的區別 。

下面分別來說說這兩者的區別:

1、淺拷貝

使用copy模組裡面的copy方法實現。

改變原始物件中為可變型別的元素的值,會同時影響拷貝物件;

改變原始物件中為不可變型別的元素的值,不會響拷貝物件。

import copy #定義乙個列表,其中第乙個元素是可變型別。

list1 = [[1,2], 'fei', 66] #進行淺

list2 = copy.copy(list1) #物件位址是否相同。

print(id(list1))

print(id(list2)) #結果:不同

print(id(list1[0]))#第乙個元素位址是否相同。

print(id(list2[0])) #結果:相同

print(id(list1[1]))#第二個元素位址是否相同。

print(id(list2[1])) #結果:相同

list1[0][0] = 2 #改變第乙個值,檢視複製物件變化。

print(list2)#結果:複製物件發生變化[[2, 2], 'fei', 66]

list1[1] = 'ge'#改變第二個值,檢視複製物件變化。

print(list2)#結果:複製物件沒發生變化[[2, 2], 'fei', 66]

2、深拷貝

copy模組裡面的deepcopy方法實現。

深拷貝,除了頂層拷貝,還對子元素也進行了拷貝。

原始物件和拷貝物件所有的可變元素位址都不一樣了。

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用

一般有三種方法,

alist=[1,2,3,["a","b"]]

(1)直接賦值,預設淺拷貝傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變

2)copy淺拷貝,沒有拷貝子物件,所以原始資料改變,子物件會改變

(3)深拷貝,包含物件裡面的自物件的拷貝,所以原始物件的改變不會造成深拷貝裡任何子元素的改變

Python 淺拷貝與深拷貝

淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...

Python 淺拷貝與深拷貝

以下例項是使用 copy 模組的 copy.copy 淺拷貝 和 copy.deepcopy usr bin python coding utf 8 import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物件的引用 c copy.copy a 物件拷貝,淺拷貝 d copy....

python 深拷貝與淺拷貝

當乙個變數 的時候,約定為 指向位址的過程 如果copy.copy 拷貝的是元組,那麼它不會進行淺拷貝,僅僅是指向 因為元組是不可變資料型別,那麼意味著資料一定不能修改,因此用copy.copy的 時候它會自動判斷,是指向。如果,用copy.copy copy.deepcopy 對乙個全部是不可變型...