淺拷貝:利用符號 『=』來進行拷貝,也可用[:]和.copy()和copy.copy(),但是
深拷貝:利用copy中的deepcopy()方法和copy()進行拷貝
共同點:如果拷貝物件都是不可變物件的話,那麼兩者效果是一樣的。
不同點:如果是可變物件的話,「=」拷貝的方式,只是拷貝了記憶體中的位址引用,兩個物件的位址引用一樣,所以兩個物件的值會隨著一方的修改而修改。而對於deepcopy()來說,如果是可變物件的話,那麼拷貝內容後新物件的記憶體位址也會重新分配,跟原來的記憶體位址不一樣了,所以兩者任意修改變數的內容不會對另一方造成影響。
淺拷貝
拷貝普通列表
est1 =
['qq'
,'ww'
,'ee'
,'rr'
,'tt'
,'yy'
,'uu'
]//定義乙個可變的物件列表
test2 = test1 //利用 = 進行淺拷貝
print(id
(test1)
,'--2-->',id
(test2)
)//檢視兩個列表的位址,兩個位址是一樣的
print
(test1, test2)
//列印兩個列表的值
test1[3]
='test1'
//修改源列表下標為3的值為 test1
print
(test1, test2)
//再次列印兩個列表,發現修改test1的值後test2的值也發生變化
test2[2]
='test2'
//修改test2的下標為2的值為test2
print
(test1, test2)
//再次列印兩個列表的值,發現兩個的下標為2的都是test2
//這是因為test2和test1引用的是用乙個位址空間的值
利用[:
]和copy
()和copy.
copy()
import copy
test1 =
['qq'
,'ww'
,'ee'
,'rr'
,'tt'
,'yy'
,'uu'
]test2 = test1.
copy()
//利用內建函式.copy()
test3 = copy.
copy
(test1)
//利用copy模組的copy()
test4 = test1[:]
//利用切片[:]
print(id
(test1),,
id(test2),id
(test3),id
(test4)
)//四個的位址都不一樣
print
(test1, test2,test3,test4)
//值是一樣的
test1[3]
='test1'
print
(test1, test2, test3,test4)
//修改源列表的值不影響其他幾個
test2[2]
='test2'
print
(test1, test2,test3,test4)
拷貝深層列表
import copy
test1 =[1
,2,[
7,8,
9],4
,5]//建立乙個深層列表
test2 = test1 //利用上面的方法分別拷貝乙份
test3 = copy.
copy
(test1)
test4 = test1[:]
test5 = test1.
copy()
print(id
(test1),id
(test2),id
(test3),id
(test4),id
(test5)
)//可以看到test1和test2的位址是一樣的,其他的位址是不同的
print
(test1, test2, test3, test4, test5)
//五個的值是一樣的
test1[3]
=11//這是修改test1也就是源的下標為3的值為11
print
(test1, test2, test3, test4, test5)
//可以看到test2和test1的值發生改變,其他的未改變
test2[1]
=12//修改test2的就test2和test1發生改變
print
(test1, test2, test3, test4, test5)
test1[2]
[2]=
100//修改test1上面的內層列表,這裡的第乙個2代表的是test1中下標為2的(也就是深層列表的下標),第二個是內層列表中的元素 9 的位置
print
(test1, test2, test3, test4, test5)
//這時候所有的內層列表的置都發生了變化
test4[2]
[1]=
500print
(test1, test2, test3, test4, test5)
//修改tes4的內層列表,一樣所有淺拷貝的列表的內層列表值都發生了變化
總結:
使用 = 進行複製時不會建立新的空間,只用的時源列表的空間,所有位址是一樣的
使用 [:] .copy() copy.copy()進行拷貝時是建立乙個新的空間,存放拷貝的值,所以值是一樣的,但是這樣的拷貝不會進行遞迴,也就是當拷貝深層列表時,對列表的拷貝是只拷貝內層列表的位址(因為內層列表是乙個單獨的空間),所以這時候拷貝的和源的內層列表使用的是同乙個位址,在修改某乙個的內層列表的值時就會影響到其他呼叫這個位址的列表
深拷貝
拷貝普通列表
import copy
test1 =[1
,3,4
,6,7
,21]test2 = copy.
deepcopy
(test1)
print(id
(test1),id
(test2)
)print
(test1, test2)
test1[4]
=100
print
(test1, test2)
拷貝深層列表
import copy
test1 =[1
,3,[
4,6,
7],21
]test2 = copy.
deepcopy
(test1)
//使用.deepcopy()進行深拷貝
print(id
(test1),id
(test2)
)//兩個的id是不同的
print
(test1, test2)
//值是一樣的
test1[1]
=100
//修改test1的值
print
(test1, test2)
//對test2沒用影響
test1[2]
[1]=
200//修改內層列表中的值對test2也沒影響
print
(test1, test2)
test2[2]
[2]=
300//修改test2中的內層列表中的值對test1也沒有影響
print
(test1, test2)
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...