深淺拷貝拷貝的例子铆农,還是自己復(fù)習(xí)歸納一遍比較好,雖然很久之前C++以及JAVA都有學(xué)習(xí)到,這里就用最近常用的Python來理解一遍吧刃唐。
淺拷貝,就是對當(dāng)前對象的引用進行的一個拷貝界轩,當(dāng)引用發(fā)生改變時画饥,原來的對象也會發(fā)生改變。
而深拷貝不一樣浊猾,深拷貝是對當(dāng)前對象的值重新分配一塊內(nèi)存空間抖甘,當(dāng)對象改變時,深拷貝的值并沒有進行改變葫慎。
淺拷貝:
>>> ls = [1,2,3,4,5]
>>> c_ls = ls
>>> ls[0]=0
>>> c_ls
[0, 2, 3, 4, 5]
>>> id(c_ls) == id(ls)
True
這里我們進行的就是淺拷貝衔彻,等于是對列表的對象的引用進行了拷貝,在C++中也就是對當(dāng)前內(nèi)存重新申請了指針偷办,但是這個指針指向的是已經(jīng)存在的內(nèi)存艰额。而深拷貝不一樣,深拷貝是為被賦值的對象重新申請了一塊內(nèi)存椒涯。
深拷貝:
>>> ls = [1,[2,3]]
>>> c_ls = ls
>>> import copy
>>> c2_ls = copy.deepcopy(ls)
>>> ls[1].append(4)
>>> c_ls
[1, [2, 3, 4]]
>>> c2_ls
[1, [2, 3]]
但是這里要注意切片悴晰,序列對象的切片其實是淺拷貝,即只拷貝頂級的對象。深拷貝只有一種形式铡溪,copy模塊中的deepcopy函數(shù)漂辐。和淺拷貝對應(yīng),深拷貝拷貝了對象的所有元素棕硫,包括多層嵌套的元素髓涯。