在python中列表中的列表索引

时间:2016-05-21 13:52:27

标签: python list indexing

我在python中有一个列表列表。

z=[[0]*6]*7

因为所有元素都是0.但现在如果我想更改列表中的单个元素,例如

z[0][0]=2

这应该改变第一个列表的第一个元素。但它实际上改变了所有元素的第一个元素。这对我来说太不合逻辑了。 可以帮助一些人。

 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0]]

1 个答案:

答案 0 :(得分:1)

这是python中经典的“程序员陷阱”。

l = [ 0 ] * 6

创建一个包含引用的六倍的列表到相同的 python对象,这里是数值常量0

现在,设置

l[0] = 1 

将通过引用另一个对象const 0对象来替换const 1对象的第一个引用。

现在,让我们来看看

z=[[0]*6]*7

首先创建一个包含对const 0对象的六个引用的列表,然后创建一个包含对该单个六元素列表的七个引用的列表。

现在,

z[0]

将为您提供z中的第一个元素,它与所有其他六个元素的相同

证明:

print id(z[0]) == id(z[1])

不同的对象有不同的ID。

所以你从来没有真正制作过不同列表的列表,只是列出了相同的列表。

您实际上可以创建不同的子列表,并通过执行类似

的操作将它们合并为一个
z = [ [0]*6 for _ in range(7) ]

然而,我觉得你实际上可能想要使用矩阵 - 如果确实如此,numpy的{​​{1}}就是你所追求的,因为:

ndarray

实际上为您提供了一个包含42个数字元素的矩阵。