Python深拷貝與淺拷貝的區別

說說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也會做相同的改變

alist=[1,2,3,["a","b"]]
b=alist
print (b) #[1, 2, 3, ['a', 'b']]
alist.append(5)
print (alist)#[1, 2, 3, ['a', 'b'], 5]
print (b)#[1, 2, 3, ['a', 'b'], 5]

 

 

2)copy淺拷貝,沒有拷貝子對象,所以原始數據改變,子對象會改變

alist=[1,2,3,["a","b"]]
import copy
c=copy.copy(alist)
print (alist)
print (c)
alist.append(5)
print (alist)
print (c)
print(alist[3])
alist[3].append('cccc')
print (alist)
print (c)#裏面的子對象被改變了

 

(3)深拷貝,包含對象裏面的自對象的拷貝,所以原始對象的改變不會造成深拷貝里任何子元素的改變

alist=[1,2,3,["a","b"]]
import copy
d=copy.deepcopy(alist)
print (alist)
print(d)

alist.append(5)
print( alist)
print (d)
print(alist[3])

alist[3].append("ccccc")
print (alist)
print(d)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章