Python里深淺拷貝區別 copy模塊中deepcopy與copy的實際差異解析

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

以上就是Python里深淺拷貝

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享