Python知识点 深浅拷贝
拷贝的需求: 一般是将原列表拷贝出一个新列表来
浅拷贝 :
将原列表内容的拷贝一份出来
原理:
在栈区中申请新表的内存地址,指向原表的元素对象,同时也指向原表嵌套在栈区中的可变类型的内存地址。原表中可变类型索引指向发生改变也随之改变。
深拷贝 :
也是将原列表拷贝出一个新列表来,但是对嵌套的可变类型做出了优化,
原理:
在栈区中申请新表的内存地址,同时把原列表中嵌套的可变类型,复制出来申请新的栈区地址,指向原表元素对象。
原表中可变类型的指向发生改变时,由于新表中嵌套的可变类型依旧指向原来的堆区元素地址,所以新表不会随之改变。
import copy list1 = ['egon', 'lxx', [1, 2]] list2 = list1 # 将list1赋值给list2 list3 = list1.copy() # 将list1浅拷贝给list3 list4 = copy.deepcopy(list1) # 将list1深拷贝给list4 list1[0] = 'EGON' # 将 list1 索引[0] 改为大写的'EGON' list1[1] = 'LXX' # 将 list1 索引[1] 改为大写的'LXX' list1[2][0] = 3 # 将 list1 索引[2]的嵌套列表[0] 改为数字的'3' list1[2][1] = 4 # 将 list1 索引[2]的嵌套列表[1] 改为数字的'4' print('原表', list1, ''' list1的内存地址:{} egon的内存地址:{} 内置列表的内存地址:{} 内置列表索引[0]的内存地址:{} '''.format(id(list1), id(list1[0]), id(list1[2]), id(list1[2][0]))) print('赋值', list2, ''' list2的内存地址:{} egon的内存地址:{} 内置列表的内存地址:{} 内置列表索引[0]的内存地址:{} '''.format(id(list2), id(list2[0]), id(list2[2]), id(list2[2][0]))) print('浅copy', list3, ''' list3的内存地址:{} egon的内存地址:{} 内置列表的内存地址:{} 内置列表索引[0]的内存地址:{} '''.format(id(list3), id(list3[0]), id(list3[2]), id(list3[2][0]))) print('深copy', list4, ''' list4的内存地址:{} egon的内存地址:{} 内置列表的内存地址:{} 内置列表索引[0]的内存地址:{} '''.format(id(list4), id(list4[0]), id(list4[2]), id(list4[2][0]))) # 原表['EGON', 'LXX', [3, 4]] # list1的内存地址:2867926975552 # egon的内存地址:2867927022064 # 内置列表的内存地址:2867926986944 # 内置列表索引[0] # 的内存地址:140734092351200 # # 赋值['EGON', 'LXX', [3, 4]] # list2的内存地址:2867926975552 # egon的内存地址:2867927022064 # 内置列表的内存地址:2867926986944 # 内置列表索引[0] # 的内存地址:140734092351200 # # 浅copy['egon', 'lxx', [3, 4]] # list3的内存地址:2867926976384 # egon的内存地址:2867924436656 # 内置列表的内存地址:2867926986944 # 内置列表索引[0] # 的内存地址:140734092351200 # # 深copy['egon', 'lxx', [1, 2]] # list4的内存地址:2867926976640 # egon的内存地址:2867924436656 # 内置列表的内存地址:2867926901440 # 内置列表索引[0] # 的内存地址:140734092351136
以上实验发生了以下这些变化

浙公网安备 33010602011771号