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
深浅拷贝 实验

 

以上实验发生了以下这些变化

posted @ 2021-08-25 17:05  Euge  阅读(67)  评论(0)    收藏  举报