python中深拷貝和淺拷貝的小總結

2021-10-07 12:19:51 字數 3020 閱讀 3977

a =

["value1"

,"value2"

]b = a

id(a)

id(b)

這裡記憶體分配了一塊位址為這個列表,然後a指向這塊位址,第二行**意思是

讓b也指向建立的列表,此時,a和b指向同一塊記憶體空間,所以id(a)=id(b)。

import copy

a =[1,

2]b =[a,3,

4]c = copy.copy(b)

print(id

(a))

print(id

(b))

print(id

(c))

print(id

(b[0])

)print(id

(c[0])

)5)print

(b)print

(c)# 輸出結果

# id(a)

# 1362057885768

# id(b)

# 1362057885640

# id(c)

# 1362057823560

# id(b[0])

# 1362057885768

# id(c[0])

# 1362057885768

# print(b)

# [[1, 2, 5], 3, 4]

# print(c)

# [[1, 2, 5], 3, 4]

從結果可以看出,b和c的id位址不一樣,c重新指向了一塊空間,但是比較b[0]和

加值,發現輸出來的b,c也隨著變化了,這就是淺拷貝,拷貝的不夠徹底。

import copy

a =[1,

2]b =[a,3,

4]c = copy.deepcopy(b)

print(id

(a))

print(id

(b))

print(id

(c))

print(id

(b[0])

)print(id

(c[0])

)5)print

(b)print

(c)# 輸出結果

# id(a)

# 1317602461064

# id(b)

# 1317602515208

# id(c)

# 1317602515272

# id(b[0])

# 1317602461064

# id(c[0])

# 1317602514824

# print(b)

# [[1, 2, 5], 3, 4]

# print(c)

# [[1, 2], 3, 4]

通過觀察**發現,id(a)和id(b[0])指向同一塊記憶體位址,但是id(c[0])卻和

它們不一樣了,c[0]重新指向了新的一塊位址,所以無論a怎麼變化,都不會影響到

c,也可以這麼說,c與a,b沒有了任何關係。於是深拷貝就是比淺拷貝更加徹底。

對於像元組這樣的不可變型別進行深淺拷貝的時候需注意,廢話不多說,上**:
import copy

a =(1,

2)b = copy.copy(a)

c = copy.deepcopy(a)

print(id

(a))

print(id

(b))

print(id

(c))

# 輸出結果

# id(a)

# 2579250860296

# id(b)

# 2579250860296

# id(c)

# 2579250860296

可見結果中三個位址一樣,所以說明對於元組這種不可變型別,它不會重新再在記憶體

中建立乙個元組物件,深淺拷貝就相當於讓b,c指向a所指向的記憶體位址。

需要我們注意的是,此時,元組中的元素是不可變型別。那要是把一些可變型別當作

元組的元素呢?**如下:

import copy

a =[1,

2]b =[3,

4]c =(a, b)

d = copy.copy(c)

e = copy.deepcopy(c)

print(id

(a))

print(id

(b))

print(id

(c))

print(id

(d))

print(id

(e))5)

print

(a)print

(c)print

(d)print

(e)# 輸出結果

# print(id(a))

# 1522131609608

# print(id(b))

# 1522131609480

# print(id(c))

# 1522131610952

# print(id(d))

# 1522131610952

# print(id(e))

# 1522131631560

# a# [1, 2, 5]

# c# ([1, 2, 5], [3, 4])

# d# ([1, 2, 5], [3, 4])

# e# ([1, 2], [3, 4])

結果可以看到,當元組的元素變為不可變型別之後,淺拷貝相當於引用,讓c和d指

向同一塊記憶體位址,深拷貝的話,就是徹底拷貝了。e和前面的變數就沒有關聯了。

作為一名以後的python從業者,這是我第乙個部落格,以後每天我也會堅持寫乙個部落格,加油。

python中的淺拷貝和深拷貝

不得不說 python核心程式設計 是一本好書,看到其中一節做一下隨筆。在python中,當建立乙個物件後,然後把它賦給另乙個物件時,python並沒有去拷貝這個物件,而是拷貝了這個物件的引用。看不懂沒關係,我們看乙個例子。raw list first second 12 32 copy list ...

python中的深拷貝和淺拷貝

淺拷貝 copy 不拷貝物件的內容,僅僅拷貝子物件的引用 深拷貝 deepcopy 會連同拷貝子物件的記憶體,對子物件的修改不會影響源物件 下面用 來測試 import copy deftest copy 淺拷貝測試 a 10 20,5,6 b copy.copy a print a a,end t...

python中的淺拷貝和深拷貝

本篇介紹下python中的深拷貝和淺拷貝,主要從基本型別 類 不可變型別等方面進行介紹。1.介紹拷貝之前首先應該明白is和 的區別,即is表示同乙個物件,比較的是值 a 1000 b 1000 a b true a is bfalse class person object def init sel...