python list的深浅copy

 
结论:
①浅拷贝是根据list中的第一层元素所在内存地址copy的,如果源第一层list中的内存地址变了,那么目的list仍然不变;如果list里面的list元素内存地址变了,那么目的list从源list来copy一份,只因为其所在的list的元素内存地址没有变化,顾copy一份;
②深拷贝是无论源list做何种操作,目的list均与源list均与修改前保持一致。
 
1.浅copy:指的是复制list中的第一层元素所在的内存地址,如果源列表改变,那么目的列表也不会改变;如果列表套列表,那么修改源列表中的子列表时,对应的目的列表也会改变,示例如下:
  • 单一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] #还是整个列表的内存地址,里面元素还保留原始的内存地址
  •  list套list
>>> 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)
  • 单一list(跟浅copy效果一致)
>>> 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 套list
上个例子还看不出来深拷贝的用处,下面来插入一个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]

猜你喜欢

转载自www.cnblogs.com/ddpeng/p/9501961.html