我确定这很简单,但不知怎的,我无法弄清楚。
a=[[0]*4]*3
a[0][0]=1
a
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
我正在尝试将1分配给第一行中的第一个元素。相反,每个行中的第一个元素被赋值为1.我应该如何进行索引以便将值分配给适当的元素?
谢谢!
答案 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:)