>>> lista=[[12,13],[0,1]]
>>> lista
[[12, 13], [0, 1]]
>>> lista[0]=lista[1]
>>> lista
[[0, 1], [0, 1]]
>>> lista[0][0]+=10
>>> lista
[[10, 1], [10, 1]]
我希望发生的是最后输出如下:
[[10, 1], [0, 1]]
但它的行为就像我键入的内容一样:
lista[0][0]+=10
lista[1][0]+=10
不只是
lista[0][0]+=10
我认为问题出在这部分:
lista[0]=lista[1]
因为当我输入
lista[0]=list(lista[1])
它工作正常。为什么会这样?
答案 0 :(得分:1)
这是因为python中的列表是可变
基本上在您这样做时:
lista[0]=lista[1]
您说的是让索引0指向内存中索引1指向的相同位置。因此,我们实际上在索引0和1处具有指向相同对象的相同指针。
视觉解释:
图片列表:
list_a = [1, 2, 3]
如果我们将list_b
设置为等于list_a
(通过执行list_b = list_a
),则可以将列表描述为:
从上面可以看到,对象(list_a
中的整数)与list_b
共享。因此,如果像这样更改list_b
中的值:
list_b[0] = 100
,然后list_a
和list_b
看起来像[100, 2, 3]
因此,如果将此概念应用于2D列表(表),则可以看到图片,我们可以观察到您正在编辑内存中的同一对象。为了获得预期的输出,您需要复制列表,使其指向内存中自己的唯一对象。
答案 1 :(得分:0)
问题是lista[0]=lista[1]
。分配使对象引用相同对象,但不会复制它们。例如,对于两个独立列表
l1 = [1,2]
l0 = l1
l0[0] = 2 # print l1 after that
您的情况完全相同。
但是,list(lista[1])
从lista[1]
的元素创建新列表,并将此新列表分配给lista[0]
。因此,现在它们是两个不同的对象,它们碰巧具有相同的值。如果更改其中一个,则其他都没有任何反应。
如果您使用其他任何复制方法,例如
lista[0] = lista[1][:]