更改一个列表会更改另一个列表

时间:2017-01-12 04:22:53

标签: python

当我更改一个列表时,另一个列表也发生了变化。

a = [[1, 1], [2, 2], [3, 3]]
b = list(a)
a[0][0] = 100
print(a)
print(b)

当我这样做时,a是[[100, 1], [2, 2], [3, 3]]。 b也是[[100, 1], [2, 2], [3, 3]]

执行b = a[:]也无法解决问题。

为什么会这样?

2 个答案:

答案 0 :(得分:4)

你做的是一份浅色的副本。浅层复制和深层复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:

浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中找到的对象。 深拷贝构造一个新的复合对象,然后递归地将副本插入到原始对象中找到的对象。

您想要创建一个全新的对象,以便不会干扰其他对象。以下是如何进行深层复制。

import copy

a = [[1, 1], [2, 2], [3, 3]]
b = copy.deepcopy(a)
a[0][0] = 100
print(a)
print(b)

答案 1 :(得分:1)

您遇到的问题是由于列表a的浅层复制,您可以执行此类操作。制作列表中存在的项目的副本(浅拷贝)

>>> a = [[1, 1], [2, 2], [3, 3]]
>>> b = [list(x) for x in a]
>>> a[0][0] = 100
>>> a
[[100, 1], [2, 2], [3, 3]]
>>> b
[[1, 1], [2, 2], [3, 3]]