import copy
a = 1 # 不可變資料型別
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體位址相同
a = [1,2] # 可變資料型別
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體位址不相同
import copy
a = 1 # 不可變資料型別
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體位址相同
a = [1,2] # 可變資料型別
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體位址不相同
# -----------不可變資料型別---------
# 情況一,內嵌可變資料型別
import copy
a = ([1,2],(3,4)) # 不可變資料型別
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體位址相同
# 情況二,內嵌不可變資料型別
a = ((1,2),(3,4)) # 不可變資料型別
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體位址相同
#-----------可變資料型別-------------
# 情況一,內嵌可變資料型別
import copy
a = [(1,2),[3,4]] # 可變資料型別
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體位址不相同
# 情況一, 可變資料型別 內嵌可變資料型別
import copy
a = [(1,2),(3,4)] # 可變資料型別
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 記憶體位址不相同
# -----------不可變資料型別---------
# 情況一,內嵌可變資料型別
import copy
a = ([1,2],(3,4)) # 不可變資料型別
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體位址不相同
# 情況二,內嵌不可變資料型別
a = ((1,2),(3,4)) # 不可變資料型別
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體位址相同
#-----------可變資料型別-------------
# 情況一,內嵌可變資料型別
import copy
a = [(1,2),[3,4]] # 可變資料型別
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體位址不相同
print(id(a[0]),id(copy_a[0])) # 記憶體位址相同
print(id(a[1]),id(copy_a[1])) # 記憶體位址不相同
# 情況一, 可變資料型別 內嵌可變資料型別
import copy
a = [(1,2),(3,4)] # 可變資料型別
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 記憶體位址不相同
print(id(a[0]),id(copy_a[0])) # 記憶體位址相同
結論二:
淺拷貝:
(1)外層是不可變型別、不管內層是否可變都是引用拷貝
(2)外層是可變型別,不管內層是否可變都會從新建立新的記憶體空間
深拷貝:
(1)外層是不可變型別,會遞迴判斷內層資料型別、如果可變則建立新的記憶體位址、都為不可變就是引用拷貝
(2)外層是可變資料型別、不管內層是否可變都會創新新的記憶體位址、但是內部如果為可變則遞迴建立、不可變則為引用位址
淺拷貝:
淺拷貝只做最頂層的資料型別判斷
如果頂層是可變型別則建立新的記憶體空間
如果頂層是不可變資料型別就是引用拷貝
深拷貝:
深拷貝做遞迴拷貝,可以遞迴拷貝所有的內部巢狀資料(可以理解為迴圈遍歷做淺拷貝判斷)
深拷貝遞迴拷貝遇到可變型別則建立新的記憶體空間
深拷貝遞迴拷貝遇到不可變資料型別就是拷貝的引用
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...