将列表元素复制回Python

时间:2017-07-07 19:50:58

标签: python list copy mutable

将元素复制回列表:

>> a = [[1,2],[3,4]]
>> b = []
>> b = a[1]
>> a.insert(1,b)
>> a
[[1,2],[3,4],[3,4]]
>> a[2][0] = 0
>> a
???

你期望列出'a'是什么?它出现为[[1,2],[0,4],[0,4]]这对我来说非常令人惊讶,而我预期[[1,2],[1,4],[0, 4]]

我有点知道答案但是,这个想法还不是很清楚。请详细说明为什么会发生这种情况以及如何摆脱它?

2 个答案:

答案 0 :(得分:6)

b = a[1]
a.insert(1,b)

b是对a[1]的引用,因此当您在插入后修改引用时,它会出现在两个位置,因为它实际上指向相同的数据。

如果您想避免这种情况,请使用deepcopy

from copy import deepcopy

a = [[1,2],[3,4]]
b = []
b = deepcopy(a[1])
a.insert(1,b)
print(a) # prints [[1, 2], [3, 4], [3, 4]]
a[2][0] = 0
print(a) # prints [[1, 2], [3, 4], [0, 4]]

答案 1 :(得分:3)

原因是由于列表在python中的工作方式,它们具有所谓的"链接数据"。如果您有一个实例指向列表中的对象,然后修改该对象,它也将在列表中进行修改,因为列表只是指向对象。所以:

x = [1,2]
b = [1,3]
x[0] = b
b[0] = 2

然后打印x会给[[2,3],2]而不是[[1,3],2]。

在您的情况下发生的事情是您将a的位置1处的对象设置为指针/变量b。然后你将指针插入a的位置2。因此,当您修改a的位置2时,您还修改了b,从而修改了。

的位置1