赋值操作就是浅拷贝(引用)
赋值操作总是储存对象的引用,而不是这些对象的拷贝。
>>> 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[:]
)能够复制序列。 - 字典 copy 方法(
X.copy()
)能够复制字典。 - 有些内置函数(例如,list)能够生成拷贝(
List(L)
)。 -
copy 标准库模块能够生成完整拷贝(
copy.deepcopy()
递归拷贝所有的组成部分,而copy.copy()
只拷贝一层)。
>>> 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)
。这一调用语句能够递归地遍历对象来复制它们所有的组成部分。
网友评论