python淺拷貝與深拷貝
阿新 • • 發佈:2022-03-11
1、直接引用
a = {1,[1,2,3]}
b =a
a 和 b 直接指向同一個物件
2、淺拷貝
使用模組 import copy
使用方法: copy.copy()
分為兩種情況:
- 被拷貝物件是不可變型別(string、元組)
- 拷貝之後 與 原先值相同,且id值也不會改變
old_str="strings" new_str=copy.copy(old_str) print(id(old_str)) print(id(new_str))
>>1351147584752 >>1351147584752
- 被拷貝物件是可變型別
- 被拷貝物件只是單純的list、set、dict物件
原來值的改變並不會影響淺複製的值
淺複製的值改變也並不會影響原來的值
原來值的id值與淺複製原來的值不同
-
- 被拷貝物件有可變型別的子物件 (如:[1,[2,3]])
原來的值改變(不改變[2,3]這個陣列的前提下)不會影響拷貝的值
淺拷貝的值(不改變[2,3]這個陣列的前提下)改變也並不會影響原來的值
原來的值改變(改變[2,3]這個陣列)會影響拷貝的值
淺拷貝的值(改變[2,3]這個陣列)改變會影響原來的值
a=[1,[2,3]] b=copy.copy(a)
a[0] = 4
b[0] = 5
print(a)
print(b)
a[1].append(33) b[1].append(22) print(a) print(b) >>[4,[2,3]]
>>[5,[2,3]] >>[4, [2, 3, 33, 22]] #a的值被改變 >>[5, [2, 3, 33, 22]] # b的值也被改變
3、深拷貝
使用模組:import copy
使用方法: copy.deecopy()
深拷貝拷貝了物件的所有元素,包括多層巢狀的元素。深拷貝出來的物件是一個全新的物件,不再與原來的物件有任何關聯。
- 因此修改原來物件的值(包括子物件)都不會影響拷貝物件的值
importcopy a=[1,[2,3]] b=copy.deepcopy(a) a[0]=4 a[1].append(3333) b[1].append(5555) print(a) print(b) >>[4, [2, 3, 3333]] >>[1, [2, 3, 5555]]