深拷貝和淺拷貝的區別

2021-09-26 02:15:06 字數 4538 閱讀 3047

淺拷貝

copy函式是淺拷貝,只對可變型別的第一層物件進行拷貝,對拷貝的物件開闢新的記憶體空間進行存

儲,不會拷貝物件內部的子物件。

不可變型別的淺拷貝示例**:

import copy # 使⽤淺拷⻉需要導⼊copy模組

# 不可變型別有: 數字、字串、元組

a1 = 123123

b1 = copy.copy(a1) # 使⽤copy模組⾥的copy()函式就是淺拷⻉了

# 檢視記憶體位址

print(id(a1))

print(id(b1))

print("-" * 10)

a2 = "abc"

b2 = copy.copy(a2)

# 檢視記憶體位址

print(id(a2))

print(id(b2))

print("-" * 10)

a3 = (1, 2, ["hello", "world"])

b3 = copy.copy(a3)

# 檢視記憶體位址

print(id(a3))

print(id(b3))

執行結果:

140459558944048

140459558944048

----------

140459558648776

140459558648776

----------

140459558073328

140459558073328

不可變型別的淺拷貝說明:

可變型別的淺拷貝示例**:

import copy # 使⽤淺拷⻉需要導⼊copy模組

# 可變型別有: 列表、字典、集合

a1 = [1, 2]

b1 = copy.copy(a1) # 使⽤copy模組⾥的copy()函式就是淺拷⻉了

# 檢視記憶體位址

print(id(a1))

print(id(b1))

print("-" * 10)

a2 =

b2 = copy.copy(a2)

# 檢視記憶體位址

print(id(a2))

print(id(b2))

print("-" * 10)

a3 =

b3 = copy.copy(a3)

# 檢視記憶體位址

print(id(a3))

print(id(b3))

print("-" * 10)

a4 = [1, 2, [4, 5]]

# 注意:淺拷⻉只會拷⻉⽗物件,不會對⼦物件進⾏拷⻉

b4 = copy.copy(a4) # 使⽤copy模組⾥的copy()函式就是淺拷⻉了

# 檢視記憶體位址

print(id(a4))

print(id(b4))

print("-" * 10)

# 檢視記憶體位址

print(id(a4[2]))

print(id(b4[2]))

# 修改資料

a4[2][0] = 6

# ⼦物件的資料會受影響

print(a4)

print(b4)

執行結果:

139882899585608

139882899585800

----------

139882919626432

139882919626504

----------

139882919321672

139882899616264

----------

139882899587016

139882899586952

----------

139882899693640

139882899693640

[1, 2, [6, 5]]

[1, 2, [6, 5]]

可變型別的淺拷貝說明:

深拷貝deepcopy函式是深拷貝, 只要發現物件有可變型別就會對該物件到最後乙個可變型別的每一層物件就行

拷貝, 對每一層拷貝的物件都會開闢新的記憶體空間進行儲存。

不可變型別的深拷貝示例**:

import copy # 使⽤深拷⻉需要導⼊copy模組

# 不可變型別有: 數字、字串、元組

a1 = 1

b1 = copy.deepcopy(a1) # 使⽤copy模組⾥的deepcopy()函式就是深拷⻉了

# 檢視記憶體位址

print(id(a1))

print(id(b1))

print("-" * 10)

a2 = "張三"

b2 = copy.deepcopy(a2)

# 檢視記憶體位址

print(id(a2))

print(id(b2))

print("-" * 10)

a3 = (1, 2)

b3 = copy.deepcopy(a3)

# 檢視記憶體位址

print(id(a3))

print(id(b3))

print("-" * 10)

# 注意: 元組⾥⾯要是有可變型別物件,發現物件有可變型別就會該物件到最後⼀個可變型別的每⼀層物件進⾏

拷⻉a4 = (1, ["李四"])

b4 = copy.deepcopy(a4)

# 檢視記憶體位址

print(id(a4))

print(id(b4))

# 元組⾥⾯的可變型別⼦物件也會進⾏拷⻉

print(id(a4[1]))

print(id(b4[1]))

執行結果:

9289120

9289120

----------

140115621848320

140115621848320

----------

140115621859592

140115621859592

----------

140115602480584

140115621834568

140115602328136

140115602436168

不可變型別的深拷貝說明:

通過上面的執行結果可以得知:

可變型別的深拷貝示例**:

import copy # 使⽤深拷⻉需要導⼊copy模組

# 可變型別有: 列表、字典、集合

a1 = [1, 2]

b1 = copy.deepcopy(a1) # 使⽤copy模組⾥的deepcopy()函式就是深拷⻉了

# 檢視記憶體位址

print(id(a1))

print(id(b1))

print("-" * 10)

a2 =

b2 = copy.deepcopy(a2)

# 檢視記憶體位址

print(id(a2))

print(id(b2))

print("-" * 10)

a3 =

b3 = copy.deepcopy(a3)

# 檢視記憶體位址

print(id(a3))

print(id(b3))

print("-" * 10)

a4 = [1, 2, ["李四", "王五"]]

b4 = copy.deepcopy(a4) # 使⽤copy模組⾥的deepcopy()函式就是深拷⻉了

# 檢視記憶體位址

print(id(a4))

print(id(b4))

# 檢視記憶體位址

print(id(a4[2]))

print(id(b4[2]))

a4[2][0] = "王五"

# 因為列表的記憶體位址不同,所以資料不會收到影響

print(a4)

print(b4)

執行結果:

140348291721736

140348291721928

----------

140348311762624

140348311221592

----------

140348311457864

140348291752456

----------

140348291723080

140348291723144

140348291723208

140348291723016

[1, 2, ['王五', '王五']]

[1, 2, ['李四', '王五']]

可變型別的深拷貝說明:

淺拷貝和深拷貝的區別

總結

深拷貝和淺拷貝的區別

retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...

深拷貝和淺拷貝的區別

一.深拷貝 源物件和副本物件是不同的兩個物件 源物件引用計數不變,副本物件計數器為1 因為是新產生的 至少有一層是物件複製 二.淺拷貝 源物件和副本物件是同乙個物件 源物件 副本物件 引用計數器 1,相當於做一次retain操作 本質 沒有產生新的物件 三.完全複製 對於被複製的物件每一層都是物件複...

深拷貝和淺拷貝的區別

深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件,新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。深拷貝是在引用方面不同,深拷貝就是建立乙個新的和原始欄位的內容相同...