拷貝與賦值
**深拷貝與淺拷貝之前,我們先弄清楚拷貝與賦值的區別:
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...