深拷貝和淺拷貝的理解

2021-08-29 05:37:14 字數 1886 閱讀 5063

物件之間賦值本質上 是物件之間的引用傳遞而已。也就是多個物件指向同乙個資料空間。

淺拷貝是對乙個物件的頂層資料的拷貝。

深拷貝是對於乙個物件所有層次的拷貝(遞迴)。

注意:型別(int型別,long型別(python3已去除long型別,只剩下int型別的資料))屬於物件,不是變數 。

深淺拷貝的作用:1,減少記憶體的使用 ;2,以後在做資料的清洗、修改或者入庫的時候,對原資料進行複製乙份,以防資料修改之後,找不到原資料。

對於不可變物件的深淺拷貝:(不可變物件有元組,字串,數值型別,布林值。。)

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

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

a=(1,2,3)

print("*****賦值*****")

b=aprint(a)

print(b)

print(id(a))

print(id(b))

print("*****淺拷貝====")

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

對於可變物件深拷貝:

a=[1,2,3]

print("*****賦值*****")

b=aprint(a)

print(b)

print(id(a))

print(id(b))

print("*****淺拷貝===")

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

*****淺拷貝===

[1, 2, 3]

[1, 2, 3]

2007696321544

2007695909960

*****深拷貝*****

[1, 2, 3]

[1, 2, 3]

2007696321544

2007696319560

理解「淺拷貝」和「深拷貝」

淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...

深拷貝和淺拷貝的理解

為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...

淺拷貝,深拷貝的理解

淺拷貝 淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層 深拷貝 深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝 淺拷貝 操作 簡單...