目錄
1 三種拷貝方式
2 解釋
3 實例
4 參考
背景
最近室友面試的時候考官就問到了一個問題:你覺得copy和deepcopy有什么區別? 於是在大神室友的熏陶下以及借鑒了網上的資料,就有了這篇博文~
三種拷貝方式
- 直接賦值:其實就是對象的引用(別名)。
- 淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。
- 深拷貝(deepcopy): copy 模塊的 deepcopy 方法,完全拷貝了父對象及其子對象。
解釋
- 第一種:
- 第二種:
- 第三種:
實例
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始對象
b = a #賦值,傳對象的引用
c = copy.copy(a) #對象拷貝,淺拷貝
d = copy.deepcopy(a) #對象拷貝,深拷貝
a.append(5) #修改對象a
a[4].append('c') #修改對象a中的['a', 'b']數組對象
print( 'a = ', a ) # 直接賦值兩者會同步去變化 都指向同一個對象
print( 'b = ', b ) # 同上
print( 'c = ', c ) # 淺拷貝只是拷貝了結構,即拷貝父對象,不會拷貝對象的內部的子對象。所以里面的list沒有拷貝
print( 'd = ', d ) # 完全拷貝了父對象及其子對象
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]
問題:現在是a的父對象發生增加,則不會被拷貝,但是如果a的父對象發生了變化而不是增加呢?
a[0] = 23
a
python [23, 2, 3, 4, ['a', 'b', 'c'], 5]
python c
python [1, 2, 3, 4, ['a', 'b', 'c']]
結論:
淺拷貝下,a的父對象發生變化或者增加刪除,之前拷貝的c不會變化。但是a的子對象變化,c會同步發生變化,因為並未拷貝子對象。
參考:http://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html