python淺拷貝深拷貝

2022-06-16 15:27:11 字數 4825 閱讀 7753

使用copy完成拷貝:

import copy  #

使用淺拷貝需要匯入copy模組

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

import copy  #

使用淺拷貝需要匯入copy模組

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

a1 = 123123b1 = 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 = 1b1 = 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, ['

李四', '

王五']]

可變型別的深拷貝說明:

python 淺拷貝 深拷貝

直接賦值 其實就是物件的引用 別名 淺拷貝 copy 拷貝父物件,不會拷貝物件的內部的子物件。深拷貝 deepcopy copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。usr bin python import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物...

python深拷貝 淺拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 alist 1,2,3,...

python 深拷貝 淺拷貝

淺拷貝是對於乙個物件的頂層拷貝 通俗的理解是 拷貝了引用,並沒有拷貝內容 深拷貝是對於乙個物件所有層次的拷貝 遞迴 拷貝字典 值相當於鍵的引用 所以copy.copy 為淺拷貝 淺拷貝對不可變型別和可變型別的copy不同 copy.copy對於可變型別,會進行淺拷貝 copy.copy對於不可變型別...