创建列表的副本,但不引用包含的对象

2024-04-25 00:41:14 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个向量a定义为:

a = [[1,2,3],[-1,-2,-3]]

我了解到,要创建对象a的副本而不引用它,我应该使用以下语法:

b = a[:]

实际上,如果我执行以下语句:

b = []
print a

输出为

>>> [[1,2,3],[-1,-2,-3]]

完全如我所料。不过,如果我做以下事情:

b = a[:]
b[0][2] = 'change a'
print a

输出为

>>> [[1,2,'change a'],[-1,-2,-3]]

所以我很清楚,对象a[0]正在被引用,即使它包含在a中。如何创建对象a的副本,使其所有内部对象都不会被引用?你知道吗


Tags: 对象定义副本语法语句change事情向量
3条回答

如果只“浅拷贝”b = a[:],则每个子列表b[n]仍然是对a[n]处引用的相同子列表的引用。相反,你需要做一个深度(er)拷贝,例如

b = [l[:] for l in a]

这将创建每个子列表的浅表副本,但由于它们的内容是不可变的,所以这不是问题。如果您有更多级别的容器嵌套,那么您需要copy.deepcopy,正如其他答案所建议的那样。你知道吗

对于这种用法deepcopy

>>> from copy import deepcopy
>>> b = deepcopy(a)

>>> b[0][2] = 'change a'
>>> print a
[[1,2,3],[-1,-2,-3]]

深度复制:https://docs.python.org/2/library/copy.html#copy.deepcopy

延伸

Deepcopy还创建类实例的单个副本。请参阅下面的简单示例。你知道吗

from copy import deepcopy

class A:
    def __init__(self):
        self.val = 'A'

>>> a = A()
>>> b = deepcopy(a)

>>> b.val = 'B'
>>> print a.val
'A'
>>> print b.val
'B'

a[:]创建列表的副本。你知道吗

可以使用^{} function递归地复制对象,也可以使用列表:

b = [el[:] for el in a]

这将使用a中嵌套列表对象的浅拷贝创建一个新的列表对象。你知道吗

相关问题 更多 >