遍历列表列表时遇到问题

时间:2020-05-27 11:49:33

标签: python loops

我正在尝试计算矩阵的转置,它以列表列表的形式存在。 初始矩阵为m n,我创建了一个矩阵n m。当我开始使用嵌套循环时,就会出现问题。

m = 0
for i in range(0, rows):
    for j in range(0, columns):
        final1[j][i] = m
        print(final1)
        m += 1

我刻意打印整个列表(最终),以查看我的值在每一步如何变化,为了简化起见,我也只分配了相应的自然数。 我看到的是(输出的前4行)

[[0, None, None, None], [0, None, None, None], [0, None, None, None]]
[[1, None, None, None], [1, None, None, None], [1, None, None, None]]
[[2, None, None, None], [2, None, None, None], [2, None, None, None]]
[[2, 3, None, None], [2, 3, None, None], [2, 3, None, None]]

因此,通过访问final [j] [i],在位置j = 0,i = 0处,值final [1] [0]和final [2] [0] 也在改变。如何避免这种情况?并制作此格式的前4行:

[[0, None, None, None], [None, None, None, None], [None, None, None, None]]
[[0, None, None, None], [1, None, None, None], [None, None, None, None]]
[[0, None, None, None], [1, None, None, None], [2, None, None, None]]
[[0, 3, None, None], [1, None, None, None], [2, None, None, None]]
rows = int(input())
columns = int(input())
final1 = [[None] * rows] * columns

这就是我声明final1的方式

2 个答案:

答案 0 :(得分:2)

之所以会这样,是因为声明语句在内部等同于将单个列表([None]*rows) column次附加到final1列表中。

如果您熟悉copy problem,这几乎是相同的。就它们代表的内存而言,final1中的所有列表都是相同的列表。

这就是为什么当您在一个列表中更新值时,该值会反映到所有人。

注意::您实际上是在创建具有column行数和row列数的列表列表。

您可以通过以下方式声明final1来解决此问题:

final1 = [[None for i in range(rows)] for j in range(columns)]

p.s::我使用内部行和外部列只是为了代替声明。它仍然会产生列表列表,其中行数为column,列数为row

答案 1 :(得分:1)

这有效:

rows = int(input())
columns = int(input())
final1 = [[None for i in range(rows)] for j in range(columns)]

m = 0
for i in range(rows):
    for j in range(columns):
        final1[j][i] = m
        m += 1

print(final1)