结论:
①浅拷贝是根据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]