copy(浅拷贝)
只会拷贝表层元素
deepcopy(深拷贝)
同时拷贝表层和内层(子层)元素, 在内存中重新创建所有子元素
示例1
from copy import copy, deepcopy
a = [1, 2, 3, [4, 5, 6]]
b = copy(a) # 浅拷贝
c = deepcopy(a) # 深拷贝
b[1] = 8
b[3][0] = 8
c[1] = 9
c[3][0] = 9
print(a) # [1, 2, 3, [8, 5, 6]]
print(b) # [1, 8, 3, [8, 5, 6]]
print(c) # [1, 9, 3, [9, 5, 6]]
示例2
def extendList(val, lst=[]):
lst.append(val)
return lst
list1 = extendList(10) # [10]
list2 = extendList(123, []) # [123]
list3 = extendList('a') # [10, 'a']
print(list1) # [10, 'a']
print(list2) # [123]
print(list3) # [10, 'a']
示例3
from copy import copy, deepcopy
from pickle import dumps, loads
a = ['x', 'y', 'z']
b = [a] * 2 # [['x','y','z'], ['x','y','z']]
c = copy(b)
d = deepcopy(b)
# 先序列化, 再反序列化 dumps(xxx, 4) 第二个参数是协议,可以是0-4, 数字越大, 序列化的时间越快
# 功能和深拷贝一致
e = loads(dumps(b, 4))
b[1].append(999) # [['x','y','z', 999], ['x','y','z', 999]]
b.append(777) # [['x','y','z', 999], ['x','y','z', 999], 777]
c[1].append(999) # [['x','y','z', 999, 999], ['x','y','z', 999, 999]]
c.append(555) # [['x','y','z', 999, 999], ['x','y','z', 999, 999], 555]
d[1].append(999) # [['x','y','z', 999], ['x','y','z', 999]]
d.append(333) # [['x','y','z', 999], ['x','y','z', 999], 333]
e[1].append(999) # [['x','y','z', 999], ['x','y','z', 999]]
e.append(111) # [['x','y','z', 999], ['x','y','z', 999], 111]
图解
手动实现深拷贝
# 自定义实现深拷贝
from pickle import loads, dumps
my_deepcopy = lambda item: loads(dumps(item, 4))
a = my_deepcopy([1, 2, 3, [4, 5, 6]])
a[3][0] = 9
print(a)