开发者

List/matrix is not saving the correct values

I have a weird problem with an assignment开发者_开发百科 I got. We are supposed to implement a matrix class. Well, it's not that hard, but Python just won't do as I tell it to. But I'm sure there is an explanation.

The problem is that, in the following code, I try to save values (provided in a list) into a matrix.

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)

When I try to print the matrix, I expect to get [[0,1,2],[3,4,5]], which I get if I run it by hand, on a piece of paper. If I print the matrix from Python I get [[3,4,5],[3,4,5]] instead. Can anyone tell me why Python acts like this, or if I made some stupid mistake somewhere? :)


The problem is in [[0]*ln]*lm. The result consists of lm references to the same list, so when you modify one row, all rows appear to change.

Try:

self.matrix = [[0]*ln for i in xrange(lm)]


The answers by Tim and aix correct your mistake, but that step isn't even necessary, you can do the whole thing in one line using a list comprehension:

self.matrix = [[values[m*ln+n] for n in range(ln)] for m in range(lm)]

You can also say:

vals = range(6)

as opposed to what you already have. This tidies up your code and makes it more Pythonic.


The problem is that self.matrix = [[0]*ln]*lm doesn't give you a list of lm separate sublists, but a list of lm references to the single same list [[0]*ln].

Try

self.matrix = [[0]*ln for i in range(lm)]

(If you're on Python 2, use xrange(lm) instead).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜