Python中的深拷贝和浅拷贝

深拷贝与浅拷贝

浅拷贝(简单拷贝)

  • 特点:只能拷贝当前列表,不能拷贝列表中的多维列表元素

实例(一维列表浅拷贝):

newlist = varlist.copy()

#两个对象的内存地址不一样
print(varlist,id(varlist))
print(newlist,id(newlist))

#对new列表进行操作也是独立的
del newlist[0]
print(varlist,newlist)

#输出结果
[1, 2, 3] 140568546805448
[1, 2, 3] 140568546673992
[1, 2, 3] [2, 3]

实例2(多维列表浅拷贝):

#定义多维列表
varlist = [1,2,3,[1,2,3],[4,5,6],[7,8,9]]
newlist = varlist.copy()
print(varlist,id(varlist))
print(newlist,id(newlist))

#当操作拷贝后的列表中元素,源列表也收到的影响
del newlist[3][1]
print(varlist,id(varlist))
print(newlist,id(newlist))

#简单拷贝只是拷贝的外面一层,内部元素对象还是引用的
#多维列表中的同一个元素(对象)其实内存地址是一样的
print(varlist[4],id(varlist[4]))
print(newlist[4],id(newlist[4]))

#输出结果
[1, 2, 3, [1, 2, 3], [4, 5, 6], [7, 8, 9]] 140568546821384
[1, 2, 3, [1, 2, 3], [4, 5, 6], [7, 8, 9]] 140568546805448

[1, 2, 3, [1, 3], [4, 5, 6], [7, 8, 9]] 140568546821384
[1, 2, 3, [1, 3], [4, 5, 6], [7, 8, 9]] 140568546805448

[4, 5, 6] 140568546821128
[4, 5, 6] 140568546821128

深拷贝

  • 特点:不光拷贝当前的列表,还将列表汇总的多维元素也拷贝了一份

实例(多维列表深拷贝):

import copy

varlist = [1,2,3,[1,2,3],[4,5,6],[7,8,9]]
newlist = copy.deepcopy(varlist)
#copy.copy()和普通的copy是一致的,尽量使用deepcopy,规避掉引用别的对象导致原列表改变的问题

#列表id地址不一致
print(varlist,id(varlist))
print(newlist,id(newlist))

#列表中的元素id地址也完全不一样
print(varlist[4],id(varlist[4]))
print(newlist[4],id(newlist[4]))

#输出结果
[1, 2, 3, [1, 2, 3], [4, 5, 6], [7, 8, 9]] 140568546821512
[1, 2, 3, [1, 2, 3], [4, 5, 6], [7, 8, 9]] 140568546821384
[4, 5, 6] 140568546822600
[4, 5, 6] 140568546823112

posted @ 2021-04-16 12:42  ST_T  阅读(144)  评论(0编辑  收藏  举报