python-淺拷貝與深拷貝

1、淺拷貝

  • 直接使用=賦值,兩個列表指向同一塊地址

    In [1]: l1 = [1,2,3]
    
    In [2]: l2 = l1
    
    In [3]: id(l1) == id(l2)
    Out[3]: True
    
  • 使用切片賦值,爲淺拷貝

    In [4]: l3 = l1[:]
    
    In [5]: id(l1) == id(l3)
    Out[5]: False
    
    In [6]: l1 == l3
    Out[6]: True
    
    • 淺拷貝是將一個地址塊的數據拷貝到另一個地址塊去
  • list1.copy()也是淺拷貝

    In [7]: l4 = l1.copy()
    
    In [8]: id(l1) == id(l4)
    Out[8]: False
    
    In [9]: l1 == l4
    Out[9]: True
    
  • 淺拷貝總結

    • 設原數據的地址爲aabb,淺拷貝即爲在內存裏新劃一塊空間(如a1b2),

    • 將原來的數據拷貝到a1b2這塊空間,但是aabb裏的內容只拷貝最外面一層(有多層嵌套時)

    In [19]: l1 = [[1,2,3], 4, 5]
    
    In [20]: l2 = l1.copy()
    
    In [21]: id(l1) == id(l2)
    Out[21]: False
    
    In [22]: id(l1[0]) == id(l2[0])
    Out[22]: True
    
    In [23]: l2[0][0] = 100
    
    In [24]: l1[0][0]
    Out[24]: 100
    
    • 可以看到l1和l2的地址是不同的,但是淺拷貝時列表裏的內容是不會重新複製一份的
    • 淺拷貝時只是新劃分了一個地址給列表變量l2,但是l2中裝的不是數據,而是l1的數據的地址
    • 由於淺拷貝只拷貝最外層數據,所以在更改了l2的內層數據後,l1的內層數據也改變了(因爲l2的內層數據實際上是l1內層數據的地址)

2、深拷貝

  • 使用深拷貝時需要引入copy模塊

  • 方法copy.deepcopy爲深拷貝

    In [25]: import copy
    
    In [26]: l1 = [[1,2,3], [10,20,30]]
    
    In [27]: l2 = copy.deepcopy(l1)
    
    In [28]: id(l1) == id(l2)
    Out[28]: False
    
    In [29]: id(l1[0]) == id(l2[0])
    Out[29]: False
    
  • 深拷貝總結:

    • 與淺拷貝的不同在於深拷貝是把被拷貝對象內部所有內容全部拷貝到另一塊地址裏去
    • 即新對象與原對象除了內容相同,除此之外兩個對象之間無關聯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章