当我循环时,为什么方阵会改变?

时间:2018-06-04 01:56:33

标签: python list for-loop nested-lists

当我通过矩阵循环以获得对角线时:

a = [[11, 2, 4],
     [4, 5, 6],
     [10, 8, -12]]

i = 0
o = 0
for a[i] in a:
    d1 = a[i][o]
    o += 1
    print(d1)

输出与预期的11, 5, -12相似 但是当我再次打印矩阵时:

print(a)

矩阵改变了

[[10, 8, -12], [4, 5, 6], [10, 8, -12]]

第一行不再像[11, 2, 4]那样。

我无法弄清楚为什么会这样。

2 个答案:

答案 0 :(得分:1)

假设您的列表列表代表方形矩阵,请在列表解析中使用单个循环来提取对角线:

>>> [a[i][i] for i in range(len(a))]
[11, 5, -12]

我不确定您在哪里遇到此for a[i] in a语法,但这并不符合您的想法。它最终将第0个元素重新分配给for循环迭代的任何副作用,所以不要这样做。

顺便说一下,修复你的代码就是:

d = []
for i in range(len(a)):
    d.append(a[i][i])

这只是对上面列表理解的明确重写。

答案 1 :(得分:1)

您正在将a的每个元素分配给a的第一个元素。请参阅以下代码。

for a[0] in a:
    print(a)

这会产生:

[[11, 2, 4], [4, 5, 6], [10, 8, -12]]
[[4, 5, 6], [4, 5, 6], [10, 8, -12]]
[[10, 8, -12], [4, 5, 6], [10, 8, -12]]

首先将[0]重新分配给[11,2,4],然后重新分配到[4,5,6],最后重新分配到[10,8,-12]。 a [1]和[2]不变。