1.浅拷贝
浅拷贝,简略的了解,就是只拷贝了援用,但没有拷贝其内容。
举个例子,旅店小于的房间号302, 小于通知了小明本人的房间号(假设晓得房间号同时就有了进入房间的钥匙和权力),小于在房间中增加一把椅子,小明进入房间就能够看到。
小于遗记了本人房间号,然而通过小明还能够进入这个房间。
代码示例
In [1]: d1 = [1, 2, 3] #小于的房间302In [2]: d2 = d1 # 告知给小明In [3]: print(id(d1),id(d2)) # 两人记忆的房间号302140110307510784 140110307510784In [6]: d1.append(4) # 小于给302房间增加一把椅子In [7]: d1 # 小于增加的,当然能够看到Out[7]: [1, 2, 3, 4]In [8]: d2 # 小明进入的也是302,天然也能够看到小于加的椅子Out[8]: [1, 2, 3, 4]In [9]: del d1 # 小于遗记了302房间In [10]: d2 # 小明记得,Out[10]: [1, 2, 3, 4]In [11]: d1 # 当然Python中有垃圾回收机制---------------------------------------------------------------------------NameError Traceback (most recent call last)<ipython-input-11-2d3a24957153> in <module>()----> 1 d1NameError: name 'd1' is not defined
这是一个很简略的浅拷贝,那看接下来的示例
In [17]: d3 = [1, 2]In [18]: d4 = ['a', 'b']In [19]: d5 = [d3, d4]In [20]: d6 = d5In [21]: import copyIn [22]: d7 = copy.copy(d5)In [23]: print(id(d5), id(d6), id(d7)) # 发现d7的id与其余两个不一样140110298615888 140110298615888 140110317120880In [24]: d5.append('x')In [25]: d5Out[25]: [[1, 2], ['a', 'b'], 'x']In [26]: d6Out[26]: [[1, 2], ['a', 'b'], 'x']In [27]: d7Out[27]: [[1, 2], ['a', 'b']] # d7没有变动In [28]: d3.append(3)In [29]: d5Out[29]: [[1, 2, 3], ['a', 'b'], 'x']In [30]: d6Out[30]: [[1, 2, 3], ['a', 'b'], 'x']In [31]: d7Out[31]: [[1, 2, 3], ['a', 'b']] # d7同样有变动
下面的示例阐明copy.copy只是复制最顶层的列表,但外面寄存是仍然雷同的援用。
2.深拷贝
与浅拷贝对应的就是深拷贝,深拷贝是对于一个对象所有档次的拷贝。
代码示例
In [32]: import copyIn [33]: p1 = ['a', 'b']In [34]: p2 = copy.deepcopy(p1)In [35]: print(id(p1), id(p2))140110298618608 140110298305312In [36]: p1.append(3)In [37]: print(p1, p2)['a', 'b', 3] ['a', 'b']In [38]: In [38]: b1 = ['a', 'b']In [39]: b2 = [1, 2]In [40]: c1 = [b1, b2]In [41]: c2 = copy.deepcopy(c1)In [42]: b1.append('c')In [43]: c1Out[43]: [['a', 'b', 'c'], [1, 2]]In [44]: c2Out[44]: [['a', 'b'], [1, 2]]
从后果能够看到深拷贝与浅拷贝的不同
3.不可变数据类型
copy.copy对于不可变类型,不会产生拷贝,它只是指向,但copy.deepcopy仍然是拷贝
代码示例
In [45]: import copyIn [46]: t1 = ('a', 'b')In [47]: t2 = copy.copy(t1)In [48]: print(id(t1), id(t2))140110307485168 140110307485168In [49]: t3 = copy.deepcopy(t1)In [50]: print(id(t1), id(t3))140110307485168 140110307485168