最近老师给了道题,题目是这样的
将一个列表的数据复制到另一个列表中
然后一开始觉得就是简单的复制,直接list1 = list2就ok了,后来觉得好像不对,似乎看到过copy这个函数
于是我搜了一下…
然后发现了除了直接赋值之外的深拷贝和浅拷贝…
于是新的疑问来了
他们有什么区别???
干想肯定是没用的,来实际操作一下康康
import copy
List = [1, 2, 4, 12, [4, 5, 6, 33], 10]
# 直接赋值
L1 = List
# 浅拷贝
L2 = copy.copy(List)
# 浅拷贝
L3 = List[:]
# 深拷贝
L4 = copy.deepcopy(List)
print(List)
print(L1)
print(L2)
print(L3)
print(L4)
运行结果如下:
[1, 2, 4, 12, [4, 5, 6, 33], 10]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
??也没发现有啥不一样啊
ok,不要慌,来我们改一下子列表的值
然后再打印一下几种拷贝
# 在List最后加上一个数
List.append(100)
运行的结果:
[1, 2, 4, 12, [4, 5, 6, 33], 10, 100]
[1, 2, 4, 12, [4, 5, 6, 33], 10, 100]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
?好的这次直接赋值的L1有了变化,但是还是看不出来深拷贝和浅拷贝有啥区别
ok我们再改一下,这次我们来改变一下List列表中的列表的值
# 在List中的列表末尾加上一个数
List[4].append(777)
运行的结果:
[1, 2, 4, 12, [4, 5, 6, 33, 777], 10, 100]
[1, 2, 4, 12, [4, 5, 6, 33, 777], 10, 100]
[1, 2, 4, 12, [4, 5, 6, 33, 777], 10]
[1, 2, 4, 12, [4, 5, 6, 33, 777], 10]
[1, 2, 4, 12, [4, 5, 6, 33], 10]
不错这次终于出现不同
就根据结果总的来说:
1.直接赋值的列表,会根据原始列表的改变而改变.
2.浅拷贝的列表,没有拷贝子对象,对子对象使用原始引用.
3.深拷贝,完全复制对象,以及其中的所有元素,原始列表的改变不会造成深拷贝里任何数据的改变