列表/矩阵未保存正确的值

时间:2010-12-13 12:07:07

标签: python list matrix

我得到的任务有一个奇怪的问题。我们应该实现矩阵类。嗯,这并不难,但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会像这样,或者我在某处犯了一些愚蠢的错误? :)

3 个答案:

答案 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))。