今天我们主要谈谈对于 列表 形式的深拷贝和浅拷贝之间的一些差别。
一、浅拷贝:
步骤1:举例
import copy
ls_1 = [1,2,3,[11,22,33]]
ls_2 = copy.copy(ls_1) #浅拷贝
print(ls_1,id(ls_1))
print(ls_2,id(ls_2))
输出:
[1, 2, 3, [11, 22, 33]] 2098712762048
[1, 2, 3, [11, 22, 33]] 2098713896896 #原列表和新列表的id不一样
步骤2:对外层列表的元素进行操作
del ls_2[1] #删除新列表第一层列表外的元素
print(ls_1)
print(ls_2)
输出:
[1, 2, 3, [11, 22, 33]] #原列表的外层列表的元素保持不变
[1, 3, [11, 22, 33]] #新列表的外层列表的元素被删除
步骤3:对内层列表的元素进行操作
del ls_2[3][1] #删除新列表内层列表的元素
print(ls_1,id(ls_1[3]))
print(ls_2,id(ls_2[3]))
输出:
[1, 2, 3, [11, 33]] 1667669403520 #原列表同样被删除,内层列表的元素地址不变,都是引用了同一个地址的对象
[1, 2, 3, [11, 33]] 1667669403520 #新列表也被删除
浅拷贝总结:
1.在多维列表中,对浅拷贝的新列表进行操作,新列表外层列表的元素和原列表外层列表的元素的值是独立改变的;
2.而内层列表的元素只是引用了同一个地址的元素,操作的对象都指向同一个,所以新列表和原列表的值都会被改变;
3.即浅拷贝只是拷贝了外层列表的元素(操作和效果都是独立的),而内层列表的元素是引用了同一个地址的对象(操作和效果都是同时的)
二、深拷贝
步骤1:举例
import copy
ls_3 = [1,2,3,[11,22,33]]
ls_4 = copy.deepcopy(ls_3) #深拷贝
print(ls_3,id(ls_3))
print(ls_4,id(ls_3))
输出:
[1, 2, 3, [11, 22, 33]] 1929404131520
[1, 2, 3, [11, 22, 33]] 1929404131520 #原列表和新列表的id地址一样
步骤2:对外层列表的元素进行操作
del ls_4[1] #删除外层列表中的元素
print(ls_3)
print(ls_4)
输出:
[1, 2, 3, [11, 22, 33]] #原列表的外层列表的元素保持不变
[1, 3, [11, 22, 33]] #新列表的外层列表的元素被删除
步骤3:对内层列表的元素进行操作
del ls_4[3][1] #删除内层列表的元素
print(ls_3)
print(ls_4)
输出:
[1, 2, 3, [11, 22, 33]] #原列表的内层列表的元素保持不变
[1, 2, 3, [11, 33]] #新列表的内层列表的元素被删除
深拷贝总结:
1.在多维列表中,对深拷贝的新列表进行操作,新列表 外层列表 的元素和原列表 外层列表 的元素的值是独立改变的
2.内层列表的元素和外层列表的元素一样,原列表和新列表的操作和效果都是独立的
3.即深拷贝将外层列表和内层列表的元素全部都拷贝了一遍,原列表和新列表的操作和效果都是独立的