1. 程式人生 > 其它 >python淺拷貝與深拷貝

python淺拷貝與深拷貝

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]]