将列表的元素复制回 Python 中的列表
Duplicating an element of a list back into the list in Python
正在将一个元素复制回列表中:
>> 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]]
我有点知道答案了,但思路还是不太清楚。请更详细地说明为什么会发生这种情况以及如何摆脱它?
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]]
原因是列表在 python 中的工作方式,它们具有所谓的 "linked data"。如果您有一个指向列表中的对象的实例,然后修改该对象,它也会在列表中被修改,因为列表只是指向对象。所以:
x = [1,2]
b = [1,3]
x[0] = b
b[0] = 2
然后打印 x 将得到 [[2,3],2] 而不是 [[1,3],2]。
在您的情况下,您将 a 的位置 1 的对象设置为 a pointer/variable b。然后你将该指针插入到 a 的位置 2。所以当你修改a的位置2时,你也修改了b,从而修改了a的位置1。
正在将一个元素复制回列表中:
>> 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]]
我有点知道答案了,但思路还是不太清楚。请更详细地说明为什么会发生这种情况以及如何摆脱它?
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]]
原因是列表在 python 中的工作方式,它们具有所谓的 "linked data"。如果您有一个指向列表中的对象的实例,然后修改该对象,它也会在列表中被修改,因为列表只是指向对象。所以:
x = [1,2]
b = [1,3]
x[0] = b
b[0] = 2
然后打印 x 将得到 [[2,3],2] 而不是 [[1,3],2]。
在您的情况下,您将 a 的位置 1 的对象设置为 a pointer/variable b。然后你将该指针插入到 a 的位置 2。所以当你修改a的位置2时,你也修改了b,从而修改了a的位置1。