深度拷贝就是将原有对象在内存中完全复制一份,而浅拷贝就是为原有对象添加签名或者说别名,我们看一下如下的代码。
>>> list1 = [1,2,[3,4]]
>>> id(list1)
4360561608
>>> list2 = list1.copy()
>>> id(list2)
4360561224
>>> id(list1[0])
4297815072
>>> id(list2[0])
4297815072
>>> id(list1[2])
4360324232
>>> id(list2[2])
4360324232
>>> list1[0] = '0'
>>> list1
['0', 2, [3, 4]]
>>> list2
[1, 2, [3, 4]]
>>> id(list1[0])
4303066704
>>>list1[2].append()
>>>list1
['0',2,[3,4,5]]
>>>list2
[1,2,[3,4,5]]
>>>
通过以上代码我们不难发现,当copy一个集合对象时,例如list,是将list里的元素指针复制了一遍而已。比如如上例子存储集合元素指针的对象是新申请的(list2),但是list中的元素指针都是不变的,这样在改变原集合对象中可变对象(例如list)时另外一个对象会受到牵连。
而浅拷贝则是完完全全的复制,拷贝后的对象与原对象将没有任何关系。
>>> import copy
>>> list1 = [1,2,[3,4]]
>>> list2 = copy.deepcopy(list1)
>>> list1
[1, 2, [3, 4]]
>>> list2
[1, 2, [3, 4]]
>>> list1[2].append(5)
>>> list1
[1, 2, [3, 4, 5]]
>>> list2
[1, 2, [3, 4]]
>>> id(list1[2])
4345559368
>>> id(list2[2])
4345560712