有人可以向我解释此列表的行为吗?

时间:2018-09-21 09:44:34

标签: python python-3.x list

>>> 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])

它工作正常。为什么会这样?

2 个答案:

答案 0 :(得分:1)

这是因为python中的列表是可变

基本上在您这样做时:

lista[0]=lista[1]

您说的是让索引0指向内存中索引1指向的相同位置。因此,我们实际上在索引0和1处具有指向相同对象的相同指针。

视觉解释:

图片列表:

list_a = [1, 2, 3]

如果我们将list_b设置为等于list_a(通过执行list_b = list_a),则可以将列表描述为: Python lists sharing the same objects in memory

从上面可以看到,对象(list_a中的整数)与list_b共享。因此,如果像这样更改list_b中的值:

list_b[0] = 100,然后list_alist_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][:]