個人理解淺拷貝和深拷貝和賦值的區別

2021-10-08 21:57:17 字數 1905 閱讀 5457

在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等 賦值 對於物件型別資料的影響 賦於該值在棧中的位址,而不是堆中的資料,使得...

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

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