1. 程式人生 > >Python中深拷貝與淺拷貝的區別:

Python中深拷貝與淺拷貝的區別:

定義:

在Python中物件的賦值其實就是物件的引用。當建立一個物件,把它賦值給另一個變數的時候,python並沒有拷貝這個物件,只是拷貝了這個物件的引用而已。

淺拷貝:拷貝了最外圍的物件本身,內部的元素都只是拷貝了一個引用而已。也就是,把物件複製一遍,但是該物件中引用的其他物件我不復制

深拷貝:外圍和內部元素都進行了拷貝物件本身,而不是引用。也就是,把物件複製一遍,並且該物件中引用的其他物件我也複製。

幾個術語的解釋:

1,變數:是一個系統表的元素,擁有指向物件的連線空間
2,物件:被分配的一塊記憶體,儲存其所代表的值
3,引用:是自動形成的從變數到物件的指標
4,注意:型別(int型別,long型別(python3已去除long型別,只剩下int型別的資料))屬於物件,不是變數
5,不可變物件:一旦建立就不可修改的物件,包括字串、元組、數字
6,可變物件:可以修改的物件,包括列表、字典。

應用的範圍:

1,切片可以應用於:列表、元組、字串,但不能應用於字典。
2,深淺拷貝,既可應用序列(列表、元組、字串),也可應用字典。

深淺拷貝的作用:

1,減少記憶體的使用
2,以後在做資料的清洗、修改或者入庫的時候,對原資料進行復制一份,以防資料修改之後,找不到原資料。

對於不可變物件的深淺拷貝:

不可變物件型別,沒有被拷貝的說法,即便是用深拷貝,檢視id的話也是一樣的,如果對其重新賦值,也只是新建立一個物件,替換掉舊的而已。

一句話就是,不可變型別,不管是深拷貝還是淺拷貝,地址值和拷貝後的值都是一樣的。

a=(1,2
,3) print("=====第一種=號淺拷貝=====") b=a print(a) print(b) print(id(a)) print(id(b)) print("=====另一種copy淺拷貝===") b=copy.copy(a) print(a) print(b) print(id(a)) print(id(b)) print("=====深拷貝=====") b=copy.deepcopy(a) print(a) print(b) print(id(a)) print(id(b)) # 結果如下: =====淺拷貝===== (1, 2, 3) (1, 2, 3) 2814522335952
2814522335952 =====另一種淺拷貝=== (1, 2, 3) (1, 2, 3) 2814522335952 2814522335952 =====深拷貝===== (1, 2, 3) (1, 2, 3) 2814522335952 2814522335952

對於可變物件深淺拷貝:

=淺拷貝:值相等,地址相等
copy淺拷貝:值相等,地址不相等
deepcopy深拷貝:值相等,地址不相等

a=[1,2,3]
print("=====第一種=號淺拷貝=====")
b=a
print(a)
print(b)
print(id(a))
print(id(b))
print("=====另一種copy淺拷貝===")
b=copy.copy(a)
print(a)
print(b)
print(id(a))
print(id(b))
print("=====深拷貝=====")
b=copy.deepcopy(a)
print(a)
print(b)
print(id(a))
print(id(b))
#結果如下:
=====淺拷貝=====
[1, 2, 3]
[1, 2, 3]
2007696321544
2007696321544
=====另一種copy淺拷貝===
[1, 2, 3]
[1, 2, 3]
2007696321544
2007695909960
=====深拷貝=====
[1, 2, 3]
[1, 2, 3]
2007696321544
2007696319560

總結:

1,深淺拷貝都是對源物件的複製,佔用不同的記憶體空間。

2,不可變型別的物件,對於深淺拷貝毫無影響,最終的地址值和值都是相等的。

3,可變型別:
=淺拷貝: 值相等,地址相等
copy淺拷貝:值相等,地址不相等
deepcopy深拷貝:值相等,地址不相等