深拷贝和浅拷贝
浅拷贝
引用(地址)拷贝,并没有产生新的内存空间
如果copy的是对象,原对象和副本对象都指向同一个内存空间,且只copy父对象,不会copy对象内部的子对象
深拷贝
会产生新的内存空间,原数据和副本数据保持各自独立
如果copy的是对象,原对象和副本对象指向不同内存空间,且会copy对象及其子对象(产生新的内存空间)
作用
1.减少内存使用
2.数据清洗、修改、入库时保留备份
copy
copy.copy(var)
功能:浅copy
copy.deepcopy(var)
功能:深copy
可变类型数据深浅copy
可变类型数据深浅copy
浅copy:copy最外层对象的值,产生新的内存空间,其中的子对象仅被引用,不会被copy
深copy:copy最外层对象和所有子对象,子对象会产生新的内存空间
import copy
# 可变类型数据的深拷贝与浅拷贝
# 浅拷贝
def copy_test():
varlist = [1,2,3,['a','b','c']]
newlist = copy.copy(varlist)
# 两个list是不同对象
print(varlist,id(varlist))
print(newlist,id(newlist))
# 操作一维元素
del newlist[0]
print(newlist)
print(varlist)
# 操作多维元素,此时的操作同样作用于原list
del newlist[2][0]
print(newlist)
print(varlist)
# 发生以上情况的原因是,list中的多维元素是同一个对象,
# copy()只复制了最外层list,两个list中的多维元素引用了内存中的同一个数据
print(id(newlist[2]))
print(id(varlist[3]))
# copy_test()
[1, 2, 3, ['a', 'b', 'c']] 196300264456
[1, 2, 3, ['a', 'b', 'c']] 196459832264
[2, 3, ['a', 'b', 'c']]
[1, 2, 3, ['a', 'b', 'c']]
[2, 3, ['b', 'c']]
[1, 2, 3, ['b', 'c']]
196300263944
196300263944
print('----------------------------------')
# 深拷贝
def deepcopy_test():
varlist = [1,2,3,['a','b','c']]
newlist = copy.deepcopy(varlist)
print(newlist)
print(id(newlist[3]))
print(id(varlist[3]))
del newlist[3][0]
print(newlist)
print(varlist)
deepcopy_test()
[1, 2, 3, ['a', 'b', 'c']]
599371649544
599212970504
[1, 2, 3, ['b', 'c']]
[1, 2, 3, ['a', 'b', 'c']]
# 深浅拷贝对比
A = {1:'a'}
B = [2,3,A]
C = (4,5)
D = [B,C]
print('A:',A,id(A))
print('B[2]:',B[2],id(B[2]))
print('D[0][2]:',D[0][2],id(D[0][2]))
print('B:',B,id(B))
print('D[0]:',D[0],id(D[0]))
print('D:',D,id(D))
# 浅拷贝
# E = copy.copy(D)
# print('E:',E,id(E),' E[0]:',E[0],id(E[0]),' E[0][2]:',E[0][2],id(E[0][2]))
# 深拷贝
E = copy.deepcopy(D)
print('E:', E, id(E), ' E[0]:', E[0], id(E[0]),' E[0][2]:',E[0][2],id(E[0][2]))
print('------------------------------------------------')
A[6] = 'b'
B.insert(3,70)
print('A:',A,id(A))
print('B',B,id(B))
print('D:',D,id(D),' D[0]:',id(D[0]),' D[0][2]:',id(D[0][2]))
print('E:',E,id(E),' E[0]:',id(E[0]),' E[0][2]:',id(E[0][2]))
A: {1: 'a'} 663909056088
B[2]: {1: 'a'} 663909056088
D[0][2]: {1: 'a'} 663909056088
B: [2, 3, {1: 'a'}] 663880618504
D[0]: [2, 3, {1: 'a'}] 663880618504
D: [[2, 3, {1: 'a'}], (4, 5)] 663880619016
E: [[2, 3, {1: 'a'}], (4, 5)] 664039138440 E[0]: [2, 3, {1: 'a'}] 664039138376 E[0][2]: {1: 'a'} 663909056328
------------------------------------------------
A: {1: 'a', 6: 'b'} 663909056088
B [2, 3, {1: 'a', 6: 'b'}, 70] 663880618504
D: [[2, 3, {1: 'a', 6: 'b'}, 70], (4, 5)] 663880619016 D[0]: 663880618504 D[0][2]: 663909056088
E: [[2, 3, {1: 'a'}], (4, 5)] 664039138440 E[0]: 664039138376 E[0][2]: 663909056328