先看下copy
In [1]: d1 = {'a':1, 'b':2, 'c':{'c1':3.1, 'c2':3.2, 'c3':{'c31':3.31,'c32':3.32}}, 'd':[41,42,43,[441,442]]}
In [3]: d1
Out[3]:
{'a': 1,
'b': 2,
'c': {'c1': 3.1, 'c2': 3.2, 'c3': {'c31': 3.31, 'c32': 3.32}},
'd': [41, 42, 43, [441, 442]]}
In [4]: d2 = d1
In [5]: id(d1), id(d2)
Out[5]: (2029403606256, 2029403606256)
In [6]: d2 = d1.copy()
In [7]: id(d1), id(d2)
Out[7]: (2029403606256, 2029403809328)
In [8]: id(d1['c']), id(d2['c'])
Out[8]: (2029403606112, 2029403606112)
可以看到copy的d1和d2的内存位置不一样,但是,d1[‘c’]和d2[‘c’]内存位置却是一样的。说明在复杂数据结构下,copy也不免“落入俗套”,复制的对象,有部分地址重合,即2个对象内部有部分数据复用了。
比较下deepcopy
In [13]: import copy
In [14]: d2 = copy.deepcopy(d1)
In [15]: id(d1['c']), id(d2['c'])
Out[15]: (2029403606112, 2029404014344)
可以看到,即便是较为复杂的数据结构,用deepcopy后,可以完整复制数据,而不会产生内部数据复用的情况。