對於不可變型別(數值、字串、元組)淺拷貝、深拷貝和「等於賦值」的情況,物件的id與原來的值相同,都是講物件指向同乙個引用
#物件時字串的時候
a='hello world'
b=ac=copy.copy(a)
d=copy.deepcopy(a)
print(a,b,c,d)
print(id(a),id(b),id(c),id(d))
此時的輸出結果是:
hello world hello world hello world hello world
1378333510384 1378333510384 1378333510384 1378333510384
import copy
a=[1,2,3,4,['a','b']]
b=aprint(id(a))
print(id(b))
c=copy.copy(a)
id(c)
d=copy.deepcopy(a)
id(d)
得到的結果是a和b的id是一樣的,c和d的id不一樣
那是因為a和b是指向同乙個位址,所以如果a和b任何中的乙個改變,那麼另乙個也會改變 下面說一下copy(淺拷貝)和deepcopy(深拷貝)的區別: deepcopy,所謂的深度複製,可以理解成完全複製然後變成乙個新的物件,複製的物件和被複製的物件沒有任何關係,彼此之前無論怎樣都互不影響 然後說一下copy,分為兩類,一種是字典資料型別的copy函式,一種是copy包的copy 1、字典資料型別的copy函式,當簡單的值替換的時候,原始字典和複製過來的字典之間互不影響,但是當新增、刪除等修改操作的時候,兩者會相互影響。
對於可變型別(列表和字典) 淺拷貝copy.copy():只拷貝父物件,不會拷貝裡面的子物件 1、沒有複雜的子物件:兩者的改變互不影響,id值也互不相同 2、當有複雜的子物件(例如列表中的乙個子物件是列表)如果不改變複雜的子物件,淺拷貝的值改變不會影響原來的值, 但是改變原來的值中的複雜子物件的值會影響淺複製的值, 因為他們子物件的引用是一樣的。
print(c)
print(a)
輸出結果:[1, 2, 3, 4, ['a', 'b', 'c', 'd']]
[1, 2, 3, 4, ['a', 'b', 'c', 'd'], 5]
說明淺拷貝的複雜物件改變也會影響原來的值。
深拷貝deepcopy.copy():**拷貝父物件以及拷貝物件的內部的子物件。
理解「淺拷貝」和「深拷貝」
淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...
深拷貝和淺拷貝的理解
為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...
深拷貝和淺拷貝的理解
物件之間賦值本質上 是物件之間的引用傳遞而已。也就是多個物件指向同乙個資料空間。淺拷貝是對乙個物件的頂層資料的拷貝。深拷貝是對於乙個物件所有層次的拷貝 遞迴 注意 型別 int型別,long型別 python3已去除long型別,只剩下int型別的資料 屬於物件,不是變數 深淺拷貝的作用 1,減少記...