深浅拷贝

# list1=[
#     'egon',
#     'lxx',
#     [1,2]
# ]

# 1、二者分隔不开,list改list2也跟着该,因为指向的就是同一个地址
# list2=list1 # 这不叫copy
# list1[0]='EGON'
# print(list2)

普通的赋值并不能算拷贝,现实中需要的是两个完全独立的列表。

如何拷贝列表?

1.浅copy:是把原列表第一层的内存地址不加区分完全copy一份给新列表

list1=['egon','lxx',[1,2]]
list3=list1.copy()
print(id(list1))
print(id(list3))
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))

['egon', 'lxx', [1, 2]]
31891840
31990656
5891376 5891120 5892096
5891376 5891120 5892096
['egon', 'lxx', [1, 2]]
list1=['egon','lxx',[1,2]]
list3=list1.copy()
print(list3)
list1[0]='EGON'
list1[1]='LXX'
list1[2]=123
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))

['egon', 'lxx', [1, 2]]
5104560 5105008 8791449064928
5105264 5104688 5105664

对于不可变类型的赋值,都是产生了新值,让愿列表的索引指向新的内存地址,并不会英雄新列表

list1=['egon','lxx',[1,2]]
list3=list1.copy()
print(list3)
list1[0]='EGON'
list1[1]='LXX'
list1[2][0]=111
list1[2][1]=222

print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))

对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,即原列表的索引仍然指向原来的内存地址,于是新列表也跟着一起受影响

通过以上可以看出,要想copy得到的新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy

2.深拷贝

import copy
list1=[ 'egon','lxx', [1,2]]
list3=copy.deepcopy(list1)
print(id(list1))
print(id(list3))
print(list3)

#          不可变        不可变        可变
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
print(id(list1[2][0]),id(list1[2][1]))
print(id(list3[2][0]),id(list3[2][1]))


40906176
40904000
['egon', 'lxx', [1, 2]]
6939952 6939696 41105664
6939952 6939696 41105984
8791447357088 8791447357120
8791447357088 8791447357120

深拷贝中把可变类型的内存地址进行了改变,而其内部的列表却没有

import copy
list1=[ 'egon','lxx', [1,2]]
list3=copy.deepcopy(list1)

list1[0]='EGON'
list1[1]='LXX'
list1[2][0]=111
list1[2][1]=222
#          不可变        不可变        可变
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))

38855600 40641072 40843520
38855984 38856304 40843840
8791447360608 8791447364160
8791447357088 8791447357120

从这里可以看出,深拷贝使两个列表变成了完全独立的列表

posted @ 2020-03-09 16:00  aksas  阅读(129)  评论(1编辑  收藏  举报