<分区>
我正在使用 python 3.4.1。
对于单个列表 a=[1,2]
,如果我复制它,b = a.copy()
当我更改 b 中的项目时
,它不会改变 a
中的项目。
但是,当我定义一个列表列表(实际上是一个矩阵)a = [[1,2],[3,4]]
时,当我分配 b = a.copy()
。我为列出 b
所做的实际上会影响 a
。
我查了他们的地址,他们是不同的。
谁能告诉我为什么?
ps:我做的是b[0][0] = x
,a中的item也改了。
<分区>
我正在使用 python 3.4.1。
对于单个列表 a=[1,2]
,如果我复制它,b = a.copy()
当我更改 b 中的项目时
,它不会改变 a
中的项目。
但是,当我定义一个列表列表(实际上是一个矩阵)a = [[1,2],[3,4]]
时,当我分配 b = a.copy()
。我为列出 b
所做的实际上会影响 a
。
我查了他们的地址,他们是不同的。
谁能告诉我为什么?
ps:我做的是b[0][0] = x
,a中的item也改了。
最佳答案
来自 copy
的文档模块:
The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):
- A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
- A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
当您调用常规 copy.copy()
时,您正在执行浅 复制。这意味着在列表列表的情况下,您将获得外部列表的新副本,但它将包含原始内部列表作为其元素。相反,您应该使用 copy.deepcopy()
,它将创建外部列表和内部列表的新副本。
您在使用 copy([1,2])
的第一个示例中没有注意到这一点的原因是像 int
这样的原语是不可变的,并且因此,如果不创建新实例就不可能更改它们的值。如果列表的内容改为可变对象(如列表,或任何具有可变成员的用户定义对象),那么这些对象的任何变化都会在列表的两个副本中看到。
关于Python复制列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684154/