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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
對於可變對象深淺拷貝:
=淺拷貝:值相等,地址相等
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
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
總結:
1,深淺拷貝都是對源對象的複製,佔用不同的內存空間。
2,不可變類型的對象,對於深淺拷貝毫無影響,最終的地址值和值都是相等的。
3,可變類型:
=淺拷貝: 值相等,地址相等
copy淺拷貝:值相等,地址不相等
deepcopy深拷貝:值相等,地址不相等

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

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

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