python深淺拷貝
阿新 • • 發佈:2020-09-15
先問問大家,什麼是拷貝?拷貝就是建立一個具有相同型別,相同值但不同id的新物件.
深淺copy其實就是完全複製一份,和部分複製一份的意思。
1、賦值運算
2、淺拷貝
l1 = [1, 'tank', [22, 33]] l2 = l1.copy() print(id(l1), id(l2)) # 2713214468360 2713214524680 print(id(l1[1]), id(l2[1])) # 2547618888008 2547618888008 print(id(l1[-1]),id(l2[-1])) # 2547620322952 2547620322952 l1 = [1, 'tank', [22, 33]] l2 = l1.copy() l1[0] = 2 print(l1) #[2, 'tank', [22, 33]] print(l2) #[1, 'tank', [22, 33]] l1 = [1, 'tank', [22, 33]] l2 = l1.copy() l1[-1][0] = 2 print(l1) #[1, 'tank', [2, 33]] print(l2) #[1, 'tank', [2, 33]]
3、深拷貝
深拷貝是copy模組中的deepcopy()函式
l1 = [1, 'tank', [22, 33]] l2= copy.deepcopy(l1) print(id(l1), id(l2)) # 2788324482440 2788324483016 print(id(l1[0]),id(l2[0])) # 1470562768 1470562768 print(id(l1[-1]),id(l2[-1])) # 2788324482632 2788324482696 print(id(l1[1]),id(l2[1])) # 2788323047752 2788323047752 l1 = [1, 'tank', [22, 33]] l2 = copy.deepcopy(l1) l1[1] = 0print(l1) #[1, 0, [22, 33]] print(l2) #[1, 'tank', [22, 33]] l1 = [1, 'tank', [22, 33]] l2 = copy.deepcopy(l1) l1[-1][0] = 0 print(l1) #[1, 'tank', [0, 33]] print(l2) #[1, 'tank', [22, 33]]
對於淺copy來說,只是在記憶體中重新建立了開闢了一個空間存放一個新列表,但是新列表中的元素與原列表中的元素是公用的。
對於深copy來說,列表是在記憶體中重新建立的,列表中可變的資料型別是重新建立的,列表中的不可變的資料型別是公用的。
深拷貝就是在記憶體中重新開闢一塊空間,不管資料結構多麼複雜,只要遇到可變型別的資料就重新開闢一塊記憶體空間把內容複製下來,直到拷貝的資料型別都是不可變物件為止
總結:
- 拷貝就是建立一個具有相同型別,相同值但不同id的新物件.
- 可變物件在賦值時,修改一個的值,另一個也會發生改變。
- 深、淺拷貝對不可變物件拷貝時,不開闢新空間,相當於賦值操作。
- 淺拷貝在拷貝時,只拷貝第一層中的引用,如果元素是可變物件,並且被修改,那麼拷貝的物件也會發生變化。
- 深拷貝 區別於淺拷貝只拷貝頂層引用,深拷貝會逐層進行拷貝,直到拷貝的所有引用都是不可變物件為止。