copy模塊的copy()和deepcopy()區別在于復制深度。1. copy()是淺拷貝,僅復制對象本身,內部元素為原對象引用,修改嵌套結構會影響原對象;2. deepcopy()是深拷貝,遞歸復制所有層級,完全獨立,修改不影響原對象。適用于簡單結構用copy(),復雜嵌套結構用deepcopy()。
在python中,copy模塊的copy()和deepcopy()函數看起來功能相似,但它們的行為差異其實挺大的。簡單來說,copy()是淺拷貝,只復制對象本身,不復制它內部引用的對象;而deepcopy()會遞歸復制對象及其內部的所有引用對象。這個區別在處理嵌套結構時尤其重要。
淺拷貝:copy.copy()
當你使用copy.copy()進行拷貝時,只是創建了一個新對象,但它里面的元素還是原對象中元素的引用。也就是說,如果原始對象里包含可變類型的數據(比如列表或字典),那么修改這些嵌套對象會影響原對象和拷貝后的對象。
舉個例子:
import copy a = [[1, 2], [3, 4]] b = copy.copy(a) b[0][0] = 9 print(a) # 輸出:[[9, 2], [3, 4]]
可以看到,雖然我們只改了b里的內容,但a也跟著變了。這是因為copy.copy()只做了一層復制,內部的子列表是共享的。
立即學習“Python免費學習筆記(深入)”;
適用場景:
- 對象結構簡單,沒有嵌套
- 只需要頂層對象獨立,內部數據可以共享
深拷貝:copy.deepcopy()
deepcopy()則完全不同,它會遞歸地復制對象中的所有內容,包括嵌套在內的每一層。這意味著無論你如何修改拷貝后的對象,原始對象都不會受到影響。
繼續上面的例子:
import copy a = [[1, 2], [3, 4]] b = copy.deepcopy(a) b[0][0] = 9 print(a) # 輸出:[[1, 2], [3, 4]]
這次a沒被影響,說明deepcopy()真正實現了“完全獨立”。
需要注意的是:
- deepcopy()性能開銷更大,尤其是對大型對象
- 如果對象之間有循環引用(比如A引用B,B又引用A),deepcopy()也能處理,但可能更慢
什么時候用哪個?
選擇copy()還是deepcopy(),主要看你的數據結構和需求:
-
? 使用copy():
- 數據結構簡單、無嵌套
- 不需要修改拷貝后的對象內部結構
- 性能優先的場景
-
? 使用deepcopy():
- 數據結構復雜、有多層嵌套
- 需要完全隔離原始對象和拷貝對象
- 安全性要求高,不能讓外部修改影響原始數據
小細節提醒
有些時候你會發現,即使是deepcopy(),某些對象也不會被真正復制,比如:
- 函數、類、模塊等不可變對象會被直接引用而不是復制
- 自定義類如果沒有正確實現__deepcopy__方法,可能會出現意料之外的結果
另外,對于一些常見結構如列表、字典、集合等,deepcopy()表現良好,可以直接放心使用。
基本上就這些。理解深淺拷貝的區別,有助于避免程序中因為引用共享導致的隱藏bug。