物件之間賦值本質上 是物件之間的引用傳遞而已。也就是多個物件指向同乙個資料空間。
淺拷貝是對乙個物件的頂層資料的拷貝。
深拷貝是對於乙個物件所有層次的拷貝(遞迴)。
注意:型別(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,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...
淺拷貝,深拷貝的理解
淺拷貝 淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層 深拷貝 深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝 淺拷貝 操作 簡單...