在python中存在深拷貝與淺bai拷貝的區別,相信有些python初學du者可能就有些疑惑,是zhi指什麼意思呢?
賦值其實只是傳遞物件引用,引用物件id是一樣的。
淺拷貝是指拷貝的只是原始物件元素的引用,換句話說,淺拷貝產生的物件本身是新的,但是它的內容不是新的,只是對原物件的乙個引用。
深拷貝是指完全拷貝原始物件,而且產生的物件是新的,並且不受其他引用物件的操作影響。
在深淺拷貝時還涉及到被拷貝變數本身是否存在不可變元素,假設a是乙個陣列,他的乙個元素是乙個不可變的字串或數字,按理說深拷貝出來的是乙個完全新的物件,拷貝時只是取了原變數的值而不是id,但如果本身是乙個不可變變數,深拷貝出來的新變數中不可變元素依然指向原來的元素,淺拷貝在拷貝時只能捕獲在變數本身結構,變數內部是什麼結構不回去考慮,所以淺拷貝出來的物件雖然物件本身的id改變了,但是內部個個元素指向還跟原物件的元素相同
下面我進行一段**演示大家就可以理解
import copy
a = b =[1
,2,3
,4,[
1,2]
]c = copy.copy(a)
d = copy.deepcopy(a)
print
(a,id
(a),
id(a[4]
))print
(b,id
(b),
id(b[4]
))print
(c,id
(c),
id(c[4]
))print
(d,id
(d),
id(d[4]
))
執行結果為
[1,
2,3,
4,[1
,2]]
140238303892352
140238303899712[1
,2,3
,4,[
1,2]
]140238303892352
140238303899712[1
,2,3
,4,[
1,2]
]140238303893184
140238303899712[1
,2,3
,4,[
1,2]
]140238303893440
140238303809152
但當我們把陣列的地五個元素換成不可變變數時會發生什麼呢
import copy
a = b =[1
,2,3
,4,5
]c = copy.copy(a)
d = copy.deepcopy(a)
print
(a,id
(a),
id(a[4]
))print
(b,id
(b),
id(b[4]
))print
(c,id
(c),
id(c[4]
))print
(d,id
(d),
id(d[4]
))[1
,2,3
,4,5
]140578188497024
9752288[1
,2,3
,4,5
]140578188497024
9752288[1
,2,3
,4,5
]140578188489664
9752288[1
,2,3
,4,5
]140578188490496
9752288
這時我們可以發現不管是深淺拷貝還是賦值,變數內部的不可變元素的id都是不會變化的 淺拷貝 深拷貝和淺賦值 深賦值
include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...
賦值 淺拷貝和深拷貝
三種方法的形式存在一定的類似,但是也存在各個之間不相同的地方。淺拷貝和深拷貝是用在物件 object 或者陣列 array 這樣的資料型別拷貝賦值時候的說法,而賦值操作也可以用在基礎的資料型別,如number string等 賦值 對於物件型別資料的影響 賦於該值在棧中的位址,而不是堆中的資料,使得...
理解「淺拷貝」和「深拷貝」
淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...