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
-
深拷貝總結:
- 與淺拷貝的不同在於深拷貝是把被拷貝對象內部所有內容全部拷貝到另一塊地址裏去
- 即新對象與原對象除了內容相同,除此之外兩個對象之間無關聯