python之深浅拷贝
list1 = ['egon', 'lxx', [1,2]]
list2 = list1 #这不叫copy 二者分隔不开,list改list2也跟着改,因为指向的就是同一个地址
拷贝:拷贝指的是拷贝原列表产生新的列表(id 是不同的)
浅拷贝:
list1 = ['egon', 'lxx', [1,2]]
list3 = list1.copy() #浅拷贝
什么是浅拷贝:
是把原列表第一层的内存地址不加区分(可变和不可变元素)完全 copy 一份给新列表
list1=[
'egon',
'lxx',
[1, 2]
]
list3 = list1.copy()
print(list3) #['egon', 'lxx', [1, 2]]
print(id(list1)) #4328662792
print(id(list3)) #4328845576
print(list3[0], list3[1], list3[2])
print(id(list3[0]), id(list3[1]), id(list3[2]))
'''
不可变 不可变 可变
egon lxx [1, 2]
4562892312 4564357336 4564371656
'''
list1[0] = 'EGON'
list1[1] = 'LXX'
list1[2][0] = 111
list1[2][1] = 222
print(list3[0], list3[1], list3[2])
print(id(list3[0]), id(list3[1]), id(list3[2]))
'''
egon lxx [111, 222]
4562892312 4564357336 4564371656
'''
总结:
1、对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的内存地址,并不会影响新列表
2、对于不可变类型时,会改变可变类型中包含元素的值,但元素的内存地址不变
也就是说,浅拷贝只是拷贝的原列表的第一层,其内部每个元素还是指向同一个内存地址。
深拷贝:
深拷贝是对每一层都拷贝,对可变及不可变类型都加以区分
import copy
list1=[
'egon',
'lxx',
[1,2]
]
list3 = copy.deepcopy(list1)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
'''
4519556632 4521021656 4520863496
4519556632 4521021656 4521049096
'''
list1[0]='EGON'
list1[1]='LXX'
list1[2][0]=111
list1[2][1]=222
# print(list1)
print(list3) #['egon', 'lxx', [1, 2]]
总结:
深拷贝是区分可变类型与不可变类型的copy机制
也就是说深拷贝是完全拷贝原列表的所有层
如果想要针对改操作,完全独立开两个列表,用 copy.deepcopy()