列表清单:索引和赋值(Python)

时间:2014-04-26 00:20:56

标签: python

我确定这很简单,但不知怎的,我无法弄清楚。

a=[[0]*4]*3
a[0][0]=1

a
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

我正在尝试将1分配给第一行中的第一个元素。相反,每个行中的第一个元素被赋值为1.我应该如何进行索引以便将值分配给适当的元素?

谢谢!

4 个答案:

答案 0 :(得分:0)

索引很好;它是如何创建/填充a这就是问题所在。您为每个“行”创建了同一列表的副本。

答案 1 :(得分:0)

您的问题并不是您的索引错误,而是顶层列表的所有三个元素实际上只是对同一列表对象的引用。您需要确保单独列出:

>>> a = [[0]*4 for _ in range(3)]
>>> a[0][0] = 1
>>> a
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

看起来你正试图制作某种矩阵或多维数组。您考虑过使用NumPy吗?

答案 2 :(得分:0)

您正在复制参考文献。顶级列表中的每个列表基本上都是相同的列表。对一个人的任何修改都会影响其他人。相反,您需要为要添加的每个列表生成新列表。

a = [[0 for i in range(4)] for j in range(3)]
a[0][0] = 1

答案 3 :(得分:0)

起初你应该意识到这一点。

如果你这样做

a = [5] * 3

令人惊讶的是,这些a[0]a[1]a[2]是同一个对象。 你可以通过这样做来确保它。

id(a[0]) ==  id(a[1]) ==  id(a[2])
#True

所以它表示如下。

a[0] --+
a[1] --+--> 5
a[2] --+

如果你这样做

a[0] = 10

然后它变得像跟随。

a[0] -----> 10
a[1] --+--> 5
a[2] --+

行。现在回到列表问题列表。 为简化您的问题,请将a定义为:

a = [[4, 5, 6]] * 3

不出所料,这些是同一个对象。

id(a[0]) ==  id(a[1]) ==  id(a[2])
#True

所以它表示如下。

a[0] --+
a[1] --+--> [4, 5, 6]
a[2] --+

如果你这样做

a[0] = 10

然后它变得像跟随。

a[0] -----> 10
a[1] --+--> [4, 5, 6]
a[2] --+

行。没问题。然后你做

a[1][0] = 8

然后它变得像跟随。

a[0] -----> 10
a[1] --+--> [8, 5, 6]
a[2] --+

完成!这很容易理解。

HIH:)