深浅copy
1、 list1 = list2
二者分隔不开,list改list2也跟着该,因为指向的就是同一个地址( 这不算copy )
list1=[
'egon',
'lxx',
[1,2]
]
list2=list1 # 这不叫copy
list1[0]='EGON'
print(list1,id(list1)) # ['EGON', 'lxx', [1, 2]] 140620272838784
print(list2,id(list2)) # ['EGON', 'lxx', [1, 2]] 140620272838784
2、 浅copy
浅copy:是把原列表第一层的内存地址不加区分完全copy一份给新列表
list1=[
'egon',
'lxx',
[1,2]
]
list3=list1.copy()
print(list3) # ['egon', 'lxx', [1, 2]]
print(id(list1)) # 140449920762368
print(id(list3)) # 140449908598912
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
# 140449908569008 140449920589616 140449920762432
# 140449908569008 140449920589616 140449920762432
实验1:对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的
内存地址,并不会影响新列表
list1=[
'egon',
'lxx',
[1,2]
]
list3=list1.copy()
list1[0]='EGON'
list1[1]='LXX'
# list1[2]=123
print(list1,id(list1)) # ['EGON', 'LXX', [1, 2]] 140307719188992
print(list3,id(list3)) # ['egon', 'lxx', [1, 2]] 140307717531776
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
# 140307719188528 140307719188592 140307719189056
# 140307717501872 140307719003952 140307719189056
实验2:但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变
即原列表的索引指向仍然指向原来的内存地址,于是新列表也跟着一起受影响
list1=[
'egon',
'lxx',
[1,2]
]
list3=list1.copy()
list1[2][0]=111
list1[2][1]=222
print(list1,id(list1)) # ['egon', 'lxx', [111, 222]] 140348049506624
print(list3,id(list3)) # ['egon', 'lxx', [111, 222]] 140348037343360
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
# 140348037313456 140348049331056 140348049506688
# 140348037313456 140348049331056 140348049506688
综合实验1和实验2可以得出,要想copy得到的新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy
3、 深copy
import copy
list1=[
'egon',
'lxx',
[1,2]
]
list3=copy.deepcopy(list1)
print(id(list1)) # 140374012220288
print(id(list3)) # 140374012219776
print(list3) # ['egon', 'lxx', [1, 2]]
# 不可变 不可变 可变
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
# 140288662746032 140288682106608 140288682273920
# 140288662746032 140288682106608 140288682358656
print(id(list1[2][0]),id(list1[2][1]))
print(id(list3[2][0]),id(list3[2][1]))
# 4374084240 4374084272
# 4374084240 4374084272
list1[0]='EGON'
list1[1]='LXX'
list1[2][0]=111
list1[2][1]=222
print(list1) # ['EGON', 'LXX', [111, 222]]
print(list3) # ['egon', 'lxx', [1, 2]]