淺拷貝 深拷貝

2021-10-01 03:20:38 字數 2272 閱讀 9522

都是物件的拷貝,都會生成乙個看起來相同的物件,他們本質的區別是拷貝出來的物件的位址是否和原物件一樣,也就是位址的複製還是值的複製的區別。

深拷貝和淺拷貝需要注意的地方就是可變元素的拷貝:

在淺拷貝時,拷貝出來的新物件的位址和原物件是不一樣的,但是新物件裡面的可變元素(如列表)的位址和原物件裡的可變元素的位址是相同的,也就是說淺拷貝它拷貝的是淺層次的資料結構(不可變元素),物件裡的可變元素作為深層次的資料結構並沒有被拷貝到新位址裡面去,而是和原物件裡的可變元素指向同乙個位址,所以在新物件或原物件裡對這個可變元素做修改時,兩個物件是同時改變的,是深拷貝不會這樣,這個是淺拷貝相對於深拷貝最根本的區別

也可以這樣理解:

深拷貝就是完全跟以前就沒有任何關係了,原來的物件怎麼改都不會影響當前物件

淺拷貝,原物件的list元素改變的話會改變當前物件,如果當前物件中list元素改變了,也同樣會影響原物件。

通常複製的時候要用深拷貝,因為淺拷貝後,兩個物件中不可變物件指向不同位址,相互不會改變,但是兩個物件中的可變元素是指向相同的位址,乙個變了,另乙個會同時改變,會有影響(list是可變物件)。

如果要讓原list和copy list沒有影響怎麼辦?

**用深拷貝,**拷貝後完全開闢新的記憶體位址來儲存之前的物件,雖然可能位址執行的內容可能相同(同乙個位址,例如』s』),但是不會相互影響。

可變物件是指,乙個物件在不改變其所指向的位址的前提下,可以修改其所指向的位址中的值;

不可變物件是指,乙個物件所指向的位址上值是不能修改的,如果你修改了這個物件的值,那麼它指向的位址就改變了,相當於你把這個物件指向的值複製出來乙份,然後做了修改後存到另乙個位址上了,但是可變物件就不會做這樣的動作,而是直接在物件所指的位址上把值給改變了,而這個物件依然指向這個位址。

>>> import copy

>>> a=[1,2,3,"a",["b","c"]]

>>> b=a

>>> a

[1, 2, 3, 'a', ['b', 'c']]

>>> b

[1, 2, 3, 'a', ['b', 'c']]

>>> id(a)

41875208

>>> id(b)

41875208

>>> c=copy.copy(a)

>>> c

[1, 2, 3, 'a', ['b', 'c']]

>>> c

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> a

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> d=copy.deepcopy(a)

>>> d

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> d

[1, 2, 3, 'a', ['b', 'c', 'd', 'x']]

>>> a

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> d[0]="m"

>>> d

['m', 2, 3, 'a', ['b', 'c', 'd', 'x']]

>>> a

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> c

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> a

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> c[0]=100

>>> c

[100, 2, 3, 'a', ['b', 'c', 'd']]

>>> a

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> c

[100, 2, 3, 'a', ['b', 'c', 'd'], 'e']

>>> a

[1, 2, 3, 'a', ['b', 'c', 'd']]

>>> a

[1, 2, 3, 'a', ['b', 'c', 'd', 'e']]

>>> c

[100, 2, 3, 'a', ['b', 'c', 'd', 'e'], 'e']

>>>

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...

深拷貝 淺拷貝

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝 深拷貝

retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...