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