結論:
①淺拷貝是根據list中的第一層元素所在內存地址copy的,若是源第一層list中的內存地址變了,那麼目的list仍然不變;若是list裏面的list元素內存地址變了,那麼目的list從源list來copy一份,只由於其所在的list的元素內存地址沒有變化,顧copy一份;
②深拷貝是不管源list作何種操做,目的list均與源list均與修改前保持一致。
1.淺copy:指的是複製list中的第一層元素所在的內存地址,若是源列表改變,那麼目的列表也不會改變;若是列表套列表,那麼修改源列表中的子列表時,對應的目的列表也會改變,示例以下:
>>> a = [1,2,3,4,5]
>>> b = a.copy() #複製一份,實際上是複製內存地址
>>> b
[1, 2, 3, 4, 5]
>>> a[2] = 10 #第3個元素重新賦值
>>>a
>>>a = [1,2,10,4,5] #生成新的列表,列表的內存地址不變,可是裏面的內存地址變了
>>> b
[1, 2, 3, 4, 5] #仍是整個列表的內存地址,裏面元素還保留原始的內存地址
>>> a.insert(2,[1,2,3]) #插入一個列表
>>> a
[1, 2, [1, 2, 3], 10, 4, 5]
>>> b = a.copy() #淺拷貝一分內存地址
>>> b
[1, 2, [1, 2, 3], 10, 4, 5]
>>> a[2][2] = 20 #替換內部小列表中的某一個元素,可是該小列表對應的內存地址不變
>>> b
[1, 2, [1, 2, 20], 10, 4, 5] #b中也會改變
2.深拷貝 :指的是徹底複製源列表,不管深copy後源列表作任何操做,都不會改變目的列表的元素
深copy須要用到copy模塊,方法是b = copy.deepcopy(a)
>>> import copy #引入第三方模塊copy
>>> a = [1,2,3,3,4,5]
>>> b = copy.deepcopy(a) #調用深拷貝的方法
>>> b
[1, 2, 3, 3, 4, 5]
>>> a[2] = 10 #更改源列表的元素值
>>> a
[1, 2, 10, 3, 4, 5]
>>> b #可是是深拷貝,該列表沒有變化
[1, 2, 3, 3, 4, 5]
上個例子還看不出來深拷貝的用處,下面來插入一個list再看
>>> import copy
>>> a = [1,2,3,3,4,5]
>>> b = copy.deepcopy(a)
>>> b
[1, 2, 3, 3, 4, 5]
>>> a.insert(1,[555,444])
>>> a
[1, [555, 444], 2, 10, 3, 4, 5]
>>> b
[1, 2, 3, 3, 4, 5]