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

Python中的深拷貝與淺拷貝

發現 python 變量 nbsp -- 減少 tro spa 切片

導讀:在Python中對象的賦值其實就是對象的引用。當創建一個對象,把它賦值給另一個變量的時候,python並沒有拷貝這個對象,只是拷貝了這個對象的引用而已。

定義:

淺拷貝:

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

深拷貝:

外圍和內部元素都進行了拷貝對象本身,而不是引用。也就是,把對象復制一遍,並且該對象中引用的其他對象我也復制。

幾個術語的解釋:

1,變量:是一個系統表的元素,擁有指向對象的連接空間
2,對象:被分配的一塊內存,存儲其所代表的值
3,引用:是自動形成的從變量到對象的指針

4,註意:類型(int類型,long類型(python3已去除long類型,只剩下int類型的數據))屬於對象,不是變量
5,不可變對象:一旦創建就不可修改的對象,包括字符串、元組、數字
6,可變對象:可以修改的對象,包括列表、字典。

應用範圍:

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

深淺拷貝的作用:

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

對於可變對象的深淺拷貝:

=淺拷貝:值相等,地址相等

 1 >>> a=[1,2,3]
 2 >>> print("------第一種=號淺拷貝------")
 3 ------第一種=號淺拷貝------
 4 >>> b=a
 5 >>> a
 6 [1, 2, 3]
 7 >>> b
 8 [1, 2, 3]
 9 >>> id(a)
10 140474302217032
11 >>> id(b)
12 140474302217032

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

可以發現,兩個對象指向的內存並不相同,也就是說,淺拷貝的對象是一個新的對象。另外,可以發現,對新對象的元素進行替換並不會影響到原對象,而對子對象——列表的修改會影響到原對象。

 1 >>> print("------第二種copy淺拷貝------")
 2 ------第二種copy淺拷貝------
 3 >>> import copy
 4 >>> b=copy.copy(a)
 5 >>> a
 6 [1, 2, 3]
 7 >>> b
 8 [1, 2, 3]
 9 >>> id(a)
10 140474302217032
11 >>> id(b)
12 140474434937800

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

同樣,兩個對象指向的內存位置並不相同,說明創建了新對象。此外,新對象的任何改動都不影響到原有的對象。

 1 >>> print("------第三種copy深拷貝------")
 2 ------第三種copy深拷貝------
 3 >>> b=copy.deepcopy(a)
 4 >>> a
 5 [1, 2, 3]
 6 >>> b
 7 [1, 2, 3]
 8 >>> id(a)
 9 140474302217032
10 >>> id(b)
11 140474302329160

對於不可變對象的深淺拷貝:

不可變對象類型,沒有被拷貝的說法,即便是用深拷貝,查看id的話也是一樣的,如果對其重新賦值,也只是新創建一個對象,替換掉舊的而已。

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

=淺拷貝:值相等,地址相等

 1 >>> a=(1,2,3)                            #元組的元素不能修改
 2 >>> print("------第一種=號淺拷貝-------")
 3 ------第一種=號淺拷貝-------
 4 >>> b=a
 5 >>> a
 6 (1, 2, 3)
 7 >>> b
 8 (1, 2, 3)
 9 >>> id(a)
10 140474434943160
11 >>> id(b)
12 140474434943160

copy淺拷貝:值相等,地址相等

 1 >>> print("------第二種copy淺拷貝------")
 2 ------第二種copy淺拷貝------
 3 >>> b=copy.copy(a)
 4 >>> a
 5 (1, 2, 3)
 6 >>> b
 7 (1, 2, 3)
 8 >>> id(a)
 9 140474434943160
10 >>> id(b)
11 140474434943160

deepcopy深拷貝:值相等,地址相等

 1 >>> print("------第三種copy深拷貝------")
 2 ------第三種copy深拷貝------
 3 >>> b=copy.deepcopy(a)
 4 >>> a
 5 (1, 2, 3)
 6 >>> b
 7 (1, 2, 3)
 8 >>> id(a)
 9 140474434943160
10 >>> id(b)
11 140474434943160

總結:

1,深淺拷貝都是對源對象的復制,占用不同的內存空間。
2,不可變類型的對象,對於深淺拷貝毫無影響,最終的地址值和值都是相等的。
3,可變類型:
      =淺拷貝: 值相等,地址相等 。 直接賦值是一個完完全全的引用,對新變量的任何改動都會影響到原對象。
      copy淺拷貝:值相等,地址不相等 。創建了新的對象,但是只拷貝了序列的元素,對於元素也是一個序列的情況(即子對象),只復制了對這個序列的引用!
      deepcopy深拷貝:值相等,地址不相。是完完全全的拷貝,把原對象完整地拷貝到了新對象中。

Python中的深拷貝與淺拷貝