将元素复制回列表中:
>> 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]]
deepcopy(a[1])
所做的与 list(a[1])
的作用类似。 - Sunal Mittal原因是由于在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,从而修改a的位置1。
b = []
这一行是完全没有用的,因为你立即重新分配了b
... - juanpa.arrivillagab = []
,我试图在内存中为列表b
分配空间。但是后来我发现了另一种方法,即b = list(a[1])
,它会为b
创建一个新对象,而不仅仅是指向a[1]
的指针。 - Sunal Mittal