Python中對象的拷貝分為:淺拷貝(copy)和深拷貝(deepcopy)。
淺拷貝:拷貝了最外圍的對象本身,內部的元素都只是拷貝了壹個引用而已。也就是,將原對象在內存中引用地址拷貝過來,然後讓新的對象指向這個地址。可以使用“=”或列表自帶的copy()函數(如list.copy()),或使用copy模塊的copy()函數。
深拷貝:外圍和內部元素都進行了拷貝對象本身,而不是引用。即把對象復制壹遍,並且該對象中引用的其他對象也同時復制,完全得到壹個新的壹模壹樣的對象,對新對象裏的值進行修改不會影響原有對象,新對象和原對象完全分離開。深拷貝只能使用copy模塊中deepcopy()函數,使用前要導入:from copy import deepcopy。
Python中對象分為不可變對象 、可變對象。
不可變對象:壹旦創建就不可修改的對象,例如:字符串、元組、數字
可變對象:可以修改的對象,例如:列表、字典。
其中Python中的切片可以應用於:列表、元組、字符串,但不能應用於字典。
而深淺拷貝,可應用於序列(列表、元組、字符串),也可應用於字典。
其中不可變對象,不管是深拷貝還是淺拷貝,地址值在拷貝後的值都是壹樣的。
以下以元組(不可變類型)為例
從上述示例可以看出:
不可變對象類型,沒有被拷貝的說法,即便是用深拷貝,查看id的話也是壹樣的,如果對其重新賦值,也只是新創建壹個對象,替換掉舊的而已。
所以不可變類型,不管是深拷貝還是淺拷貝,地址值和拷貝後的值都是壹樣的。
以下以列表(可變類型)為例
第壹種方法:使用=號淺拷貝
輸出結果:
第二種方法:使用copy淺拷貝
輸出結果:
第三種方法:使用deepcopy深拷貝
輸出結果:
從上述示例可以看出:
=淺拷貝:值相等,地址相等
copy淺拷貝:值相等,地址不相等
deepcopy深拷貝:值相等,地址不相等
總結:
1,深淺拷貝都是對源對象的復制,占用不同的內存空間。
2,不可變類型的對象,對於深淺拷貝毫無影響,最終的地址值和值都是相等的。
3,可變類型的對象,使用=淺拷貝時, 值相等,地址相等,對新對象裏的值進行修改同時會影響原有對象;使用copy淺拷貝時值相等,地址不相等;使用deepcopy深拷貝時值相等,地址不相等。可以看出針對可變類型copy淺拷貝和deepcopy深拷貝,對新對象裏的值進行修改不會影響原有對象。