我在下面编写了以下代码,但它的输出并不像我预期的那样。有谁知道它为什么会这样?
N.B。:我知道代码没有正确转换列表 - 我在编写函数时偶然发现了这种奇怪的行为。
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
transposed = []
for i in range(4):
print("i", i)
t_list = []
for row in matrix:
print("row", row)
t_list.append(row[i])
print("t_list**********", t_list)
transposed.append(t_list)
print("transposed//////////////", transposed)
我希望第一行末尾的这个函数的输出是:
[[1], [1, 5], [1, 5, 9]]
相反,它似乎输出:
[[1, 5, 9], [1, 5, 9], [1, 5, 9]]
有谁知道为什么?
谢谢!
答案 0 :(得分:0)
这似乎是transposed.append(t_list)
行中的缩进问题:
transposed = []
for i in range(4):
t_list = []
for row in matrix:
t_list.append(row[i])
transposed.append(t_list)
此代码打印:
[[1, 5, 9],
[2, 6, 10],
[3, 7, 11],
[4, 8, 12]]
Transpose已在numpy中实现,它适用于python数组:
import numpy as np
np.transpose(matrix)
答案 1 :(得分:0)
问题在于:
t_list = []
for row in matrix:
t_list.append(row[i])
transposed.append(t_list)
在循环内部,列表对象t_list
的内容发生了变化,但是
列表对象本身保持不变。因此,transposed
获得相同的对象
对于每一行。
通过附加当前列表的副本而不是原始列表来修复此问题 列表对象。
transposed.append(list(t_list))
答案 2 :(得分:0)
关键是制作内部列表的副本,然后附加在外部列表中。
copy = t_list [::]
这是因为list是一个对象而且是一个refresnce。因此,当您在列表中追加另一个项目时,它将在该对象所在的所有位置更新。在您的情况下,您将列表附加到列表中,然后更新内部列表,这也会导致先前的列表项更新。您需要在transposed
列表中附加列表副本。这是一个解决方案。
transposed = []
for i in range(4):
print("i", i)
t_list = []
for row in matrix:
print("row", row)
t_list.append(row[i])
print("t_list**********", t_list)
transposed.append(t_list[::])
print("transposed//////////////", transposed)