我得到的任务有一个奇怪的问题。我们应该实现矩阵类。嗯,这并不难,但Python不会按照我的说法去做。但我确信有一个解释。
问题是,在下面的代码中,我尝试将值(在列表中提供)保存到矩阵中。
class simplematrix:
matrix = [[]]
def __init__(self, * args):
lm = args[0]
ln = args[1]
values = args[2]
self.matrix = [[0]*ln]*lm
for m in range(lm):
for n in range(ln):
self.matrix[m][n] = values[(m*ln)+n]
vals = [0,1,2,3,4,5]
a = simplematrix(2,3,vals)
当我尝试打印矩阵时,我希望得到[[0,1,2],[3,4,5]],如果我在一张纸上手工操作,我得到它。如果我从Python打印矩阵,我得到[[3,4,5],[3,4,5]]。 任何人都可以告诉我为什么Python会像这样,或者我在某处犯了一些愚蠢的错误? :)
答案 0 :(得分:2)
问题出在[[0]*ln]*lm
。结果包含lm
对同一列表的引用,因此当您修改一行时,所有行都会显示更改。
尝试:
self.matrix = [[0]*ln for i in xrange(lm)]
答案 1 :(得分:2)
蒂姆和艾克斯的答案纠正了你的错误,但这一步甚至没有必要,你可以使用列表理解在一行中完成整个事情:
self.matrix = [[values[m*ln+n] for n in range(ln)] for m in range(lm)]
你也可以说:
vals = range(6)
与您已有的相反。这样可以整理你的代码并使其更具Pythonic。
答案 2 :(得分:1)
问题在于,self.matrix = [[0]*ln]*lm
没有为您提供lm
个单独的子列表的列表,而是列出了lm
个单个列表[[0]*ln]
的引用。< / p>
尝试
self.matrix = [[0]*ln for i in range(lm)]
(如果您使用的是Python 2,请改用xrange(lm)
)。