每日一練 python中的深拷貝與淺拷貝

2021-09-25 12:12:08 字數 1883 閱讀 9501

拷貝與賦值

**深拷貝與淺拷貝之前,我們先弄清楚拷貝與賦值的區別:

x =[1

,2,3

]#變數x

y = x #賦值

z = x.copy(

)#拷貝

#賦值和拷貝顯示的結果相同

print

(x)#[1, 2, 3]

print

(y)#[1, 2, 3]

print

(z)#[1, 2, 3]

#通過id()函式發現賦值不改變id,就是記憶體位址,而拷貝會重新分配乙個id

print(id

(x))

#80022536

print(id

(y))

#80022536

print(id

(z))

#82371080

所以,拷貝實際上會重新分配乙個新的記憶體位址,相當於重新建立乙個變數。而賦值不改變原來的記憶體位址,只是引用該記憶體位址對應的記錄。那深拷貝和淺拷貝又有何區別呢?

淺拷貝

1、通過.copy()方法

2、僅拷貝父物件,也就是第一層資料(**解釋)

m =[1

,2,3

,[4,

5,6]

]#變數m

n = m.copy(

)#淺拷貝

#更改m中第乙個元素m[0

]='a'print

(m)#['a', 2, 3, [4,5,6]]

print

(n)#[1, 2, 3, [4, 5, 6]] 發現m的值改變,n並沒有改變

#更改m中第三個元素中的第乙個元素m[3

][0]

='b'

print

(m)#['a', 2, 3, ['b', 5, 6]]

print

(n)#[1, 2, 3, ['b', 5, 6]] 此時n卻被修改了,為什麼?

#檢視子物件記憶體位址發現,淺拷貝後的第三個元素的記憶體位址並沒有改變。

print(id

(m[3])

)#76549384

print(id

(n[3])

)#76549384

可以發現,第二層[4, 5, 6]並沒有拷貝成功,所以n會隨著m的更新而更新。這就是上面說的,淺拷貝只會拷貝第一層資料。

深拷貝

1、呼叫copy模組中的deepcopy()

2、完全拷貝物件(**解釋)

import copy

a =[1,

2,3,

[4,5

,6]]

#變數a

b = copy.deepcopy(a)

#深拷貝

#檢視子物件的記憶體位址

print(id

(a[3])

)#76546952

print(id

(b[3])

)#76415048 此時記憶體位址發生了變化

#更改a中的元素,發現b不會改變a[0

]='a'a[3]

[0]=

'b'print

(a)#['a', 2, 3, ['b', 5, 6]]

print

(b)#[1, 2, 3, [4, 5, 6]]

可以發現,深拷貝是不管你有多少層物件,資料都不會共享,這就是它與淺拷貝的本質區別。

python每日一練

人生苦短,我用python 2018.6.5 有個目錄,裡面是你自己寫過的程式,統計一下你寫過多少行 包括空行和注釋,但是要分別列出來 coding utf 8 import re import glob defcodecolletion path filelist glob.glob path p...

Python每日一練

人生苦短,我用python 2018.6.13 最近事情有點多,有幾天沒寫了,正好最近需要統計一下各組排名,也就拿python代替手工了 各組給出其他組的排名,統計每個組最終的得分,第一名為0.5,第二名0.4,以此類推。coding utf 8 groups 3,2,5,4,6 1,3,5,6,4...

Python每日一練0002

如何序列化輸出元素包含字串元組的字串元組 好繞 舉個例子 zoo1 monkey elephant zoo2 python zoo1 將zoo2輸出為python,monkey,elephant容易想到使用join 函式,但join 函式要求元素必須都是字串型別,否則會丟擲typeerror錯誤 z...