假设我们有两个需求:
- 拷贝一个原列表,产生一个新列表
- 想让两个列表完全独立开,效果为List1改了List2不改,针对的是改操作的独立
对于上述需求,我们有两个不同的功能解决方法,即浅拷贝和深拷贝
浅拷贝
浅拷贝是把第一层,不管是可变还是不可变类型,一股脑的拷贝给新列表。
浅拷贝是不加区分,完全拷贝给新列表,这对不可变类型是没问题的,但是对可变类型,两个数据就粘在一起了
执行效果差别:
# 如何Copy列表
import copy
list1 = ['1', '2', ['3','4','5']]
list2 = list1.copy()
list1[0] = '2'
print("list1=",list1,"list1_id=",id(list1)) # 结果为list1= ['2', '2', ['3', '4', '5']] list1_id= 2624156334400
print("list2=",list2,"list2_id=",id(list2)) # 结果为list2= ['1', '2', ['3', '4', '5']] list2_id= 2624156334336
list1[2][0] = '9'
print("list1=",list1) # 结果为list1= ['2', '2', ['9', '4', '5']]
print("list2=",list2) # 结果为list2= ['2', '2', ['9', '4', '5']]
实际内存地址差别:
# 如何Copy列表
import copy
list1 = ['1', '2', ['3','4','5']]
list2 = list1.copy()
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list2[0]),id(list2[1]),id(list2[2]))
'''
运行结果如下:
1787387503088 1787390132080 1787390097856
1787387503088 1787390132080 1787390097856
'''
堆区内发生的事情如下:
深拷贝
执行效果差别
# 如何Copy列表
import copy
list1 = ['1', '2', ['3','4','5']]
list2 = copy.deepcopy(list1)
list1[0] = '2'
print("list1=",list1,"list1_id=",id(list1)) # 结果为list1= ['2', '2', ['3', '4', '5']] list1_id= 1421097367936
print("list2=",list2,"list2_id=",id(list2)) # 结果为list2= list2= ['1', '2', ['3', '4', '5']] list2_id= 1421097367872
list1[2][0] = '9'
print("list1=",list1) # 结果为list1= ['2', '2', ['9', '4', '5']]
print("list2=",list2) # 结果为list2= ['1', '2', ['3', '4', '5']]
实际内存地址差别
# 如何Copy列表
import copy
list1 = ['1', '2', ['3','4','5']]
list2 = copy.deepcopy(list1)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list2[0]),id(list2[1]),id(list2[2]))
'''
运行结果如下:
2148391772656 2148396648880 2148397905984
2148391772656 2148396648880 2148398012224
'''
堆区内发生事情如下:
可以看到深拷贝更加合理,浅拷贝只拷贝了第一层,而深拷贝考虑的更多,每一层都拷贝,底层原理是深拷贝对可变不可变类型加以了区分。虽然没有浅拷贝省空间,但是不会对拷贝后的列表进行修改不会影响新列表。