Python基礎之賦值,淺拷貝,深拷貝的區別
一、賦值
不會開辟新的內存空間,隻是復制瞭新對象的引用。所以當一個數據發生變化時,另外一個數據也會隨之改變。
二、淺拷貝
創建新對象,其內容是對原對象的引用。淺拷貝之所以稱為淺拷貝,是因為它僅僅隻拷貝瞭第一層,即隻拷貝瞭最外層的對象本身,內部的元素都隻是拷貝瞭一個引用而已,即內部元素如果被修改,則另外一個數據也會發生變化。
淺拷貝的三種形式:
A = [1, 2, 3, 4]
- 切片操作
# 第1種 B = A[:] # 第2種 B = [a for a in A]
- 工廠函數
B = list(A)
- copy函數
B = copy.copy(A)
淺拷貝要分兩種情況進行討論:
1)當淺拷貝的值是不可變對象(例如字符串、元組、數值類型)時,和賦值情況一樣,對象的內存地址(id())與淺拷貝原來的值一致。
2)當淺拷貝的值是可變對象(例如列表、字典、集合等)時,也需要分兩種情況討論:
首先,原來值的內存地址與拷貝後的內存地址不同。
- 當要拷貝的對象裡面,沒有可變的子對象時,原來值(拷貝值)的改變並不會影響拷貝值(原來值)。
- 當要拷貝的對象裡面,有可以改變的子對象時,改變該子對象,原來值和拷貝值之間會互相影響。
三、深拷貝
深拷貝拷貝出來的對象是一個全新的對象,和原來的對象沒有任何的關聯。改變原有對象不會影響新的拷貝對象。
四、例子
- 不可變對象
import copy # 不可變對象 # A = (1, 2, 'hello') # 元組 # A = 1 # 數值 A = 'hello' # 字符串 print("********賦值********") B = A print(id(A)) print(id(B)) print(A) print(B) print("********淺拷貝********") B = copy.copy(A) print(id(A)) print(id(B)) print(A) print(B) print("********深拷貝********") B = copy.deepcopy(A) print(id(A)) print(id(B)) print(A) print(B)
結果:
********賦值********
1894005658264
1894005658264
hello
hello
********淺拷貝********
1894005658264
1894005658264
hello
hello
********深拷貝********
1894005658264
1894005658264
hello
hello
- 可變對象
import copy # 可變對象 A = [1, 2, 3] print("********賦值********") B = A print(id(A)) print(id(B)) print(A) print(B) print("********淺拷貝********") B = copy.copy(A) print(id(A)) print(id(B)) print(A) print(B) print("********深拷貝********") B = copy.deepcopy(A) print(id(A)) print(id(B)) print(A) print(B)
結果:
********賦值********
1602694308360
1602694308360
[1, 2, 3]
[1, 2, 3]
********淺拷貝********
1602694308360
1602694308424
[1, 2, 3]
[1, 2, 3]
********深拷貝********
1602694308360
1602950316296
[1, 2, 3]
[1, 2, 3]
- 可變對象修改外層
import copy # 可變對象 A = [1, 2, 3, [11, 10, 20]] # 可變對象的外層修改 B1 = A # 賦值 B2 = copy.copy(A) # 淺拷貝 B3 = copy.deepcopy(A) # 深拷貝 A.append(4) print("********賦值********") print(id(A)) print(id(B1)) print(A) print(B1) print("********淺拷貝********") print(id(A)) print(id(B2)) print(A) print(B2) print("********深拷貝********") print(id(A)) print(id(B3)) print(A) print(B3)
結果:
********賦值********
2215309238856
2215309238856
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20], 4]
********淺拷貝********
2215309238856
2215593496776
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
********深拷貝********
2215309238856
2215593518024
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
- 可變對象修改內層
import copy # 可變對象 A = [1, 2, 3, [11, 10, 20]] # 可變對象的內層修改 B1 = A # 賦值 B2 = copy.copy(A) # 淺拷貝 B3 = copy.deepcopy(A) # 深拷貝 A[3].append(4) print("********賦值********") print(id(A)) print(id(B1)) print(A) print(B1) print("********淺拷貝********") print(id(A)) print(id(B2)) print(A) print(B2) print("********深拷貝********") print(id(A)) print(id(B3)) print(A) print(B3)
結果
********賦值********
2288591069768
2288591069768
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********淺拷貝********
2288591069768
2288847138760
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********深拷貝********
2288591069768
2288847168264
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20]]
到此這篇關於Python基礎之賦值,淺拷貝,深拷貝的區別的文章就介紹到這瞭,更多相關Python賦值 淺拷貝 深拷貝的區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python淺拷貝與深拷貝使用方法詳解
- 淺析Python的對象拷貝和內存佈局
- python中如何對多變量連續賦值
- Python中list列表的賦值方法及遇到問題處理
- Python學習之列表常用方法總結