浅拷贝(引用) VS 深拷贝

2018-04-25  本文已影响0人  奥特曼255

赋值操作就是浅拷贝(引用)
赋值操作总是储存对象的引用,而不是这些对象的拷贝。

>>> X = [1, 2, 3]
>>> L = ['a', X, 'b']         # Embed references to X's object
>>> D = {'x':X, 'y':2}

上边的例子中,列表有三个引用,修改这三个引用中的任意一个,也会改变另外两个。

>>> X[1] = 'surprise'
>>> L                          # Changes all three references 
['a', [1, 'surprise', 3], 'b']
>>> D
{'x':[1, 'surprise', 3], 'y':2}

如果需要拷贝对象,可用下列四种方法。

>>> L = [1, 2, 3]
>>> D = {'a':1, 'b':2}

>>> A = L[:]
>>> B = D.copy()

>>> A[1] = 'Ni'
>>> B['c'] = 'spam'
>>>
>>> L, D
([1, 2, 3], {'a':1, 'b':2})
>>> A, B
([1, 'Ni', 3], {'a':1, 'b':2, 'c':'spam'})

拷贝需要注意的是:无条件值的分片和字典 copy 方法只能做顶层复制。如果你需要一个深层嵌套的数据结构的完整拷贝,那么就要使用标准的 copy 模块——包括 import copy 语句,并编辑 X = copy.deepcopy(Y)。这一调用语句能够递归地遍历对象来复制它们所有的组成部分。

上一篇 下一篇

猜你喜欢

热点阅读