Loading

04-Python-深浅拷贝机制

假设我们有两个需求:

  1. 拷贝一个原列表,产生一个新列表
  2. 想让两个列表完全独立开,效果为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
'''

堆区内发生事情如下:
深拷贝堆区内发生的事情

可以看到深拷贝更加合理,浅拷贝只拷贝了第一层,而深拷贝考虑的更多,每一层都拷贝,底层原理是深拷贝对可变不可变类型加以了区分。虽然没有浅拷贝省空间,但是不会对拷贝后的列表进行修改不会影响新列表。

posted @ 2023-01-21 22:52  nliuc  阅读(43)  评论(0)    收藏  举报