情况一:
from copy import deepcopy
List1 = [1,2,3,[4,5]] #源列表的元素有1,2,3和一个列表
List2 = List1.copy() #列表2是源列表的浅拷贝
List3 = deepcopy(List1) #列表3是源列表的深拷贝
List1[2] = 10086 #把源列表的某值改变
print(List1) #[1, 2, 10086, [4, 5]]
print(List2) #[1, 2, 3, [4, 5]]
print(List3) #[1, 2, 3, [4, 5]]
这是最常见的情况,无论是浅拷贝还是深拷贝,都不会被源列表数值改变而影响。
运行规则:程序找了个地方存了10086这个值,然后让List1[2]指向10086。
那’3’这个值还在被List2[2]指着,没变。
至于深拷贝的List3,是完全独立门户的,不会受任何影响。
情况二:
from copy import deepcopy
List1 = [1,2,3,[4,5]] #源列表有123和一个列表
List2 = List1.copy() #列表2是源列表的浅拷贝
List3 = deepcopy(List1) #列表3是源列表的深拷贝
List1[3]= [4,6] #把源列表某值改变
print(List1) #[1, 2, 3, [4, 6]]
print(List2) #[1, 2, 3, [4, 5]]
print(List3) #[1, 2, 3, [4, 5]]
情况二其实是情况一一样的结果,但是是作为情况三的对照实验。
情况二的List1找了块地方建了一个列表,内容是[4,6],再把List1的[3]指向这个列表。
情况三:
from copy import deepcopy
List1 = [1,2,3,[4,5]] #源列表有123和一个列表
List2 = List1.copy() #列表2是源列表的浅拷贝
List3 = deepcopy(List1) #列表3是源列表的深拷贝
List1[3][1] = ['UZI'] #这次是把套娃列表里面的值改变了
print(List1) #[1, 2, 3, [4, ['UZI']]]
print(List2) #[1, 2, 3, [4, ['UZI']]]
print(List3) #[1, 2, 3, [4, 5]]
情况三对照于情况二,情况二是整个列表拉去改变,相当于新建了一个列表进行更改与重定向,情况三是在这个列表进行小修改,不影响指针指向,就会导致浅拷贝的指针仍然指着源列表的位置,随着源列表里面的更改一并更改。
总结:深拷贝是新建一套值,与源列表完全独立互不影响的,浅拷贝是新建一套指针指向源列表的位置。
好比我们去找财务结算工资,情况一二是一位新财务入职,旧财务还在交接的情况,新财务来之前的账(浅拷贝)还是需要员工去找旧财务对账。
情况三是旧财务交接完毕,公司就只有财务这个人,没有新旧之分了,所有人对账(浅拷贝)都只能去找财务了。
PS:还在学习初期,可能解释还是有偏差,如果您觉得有任何觉得值得讨论的地方,可以在底下留言。感谢您的观看。