Список / матрица не сохраняет правильные значения - PullRequest
2 голосов
/ 13 декабря 2010

У меня странная проблема с заданием, которое я получил.Мы должны реализовать матричный класс.Ну, это не так сложно, но 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 ]

2 голосов
/ 13 декабря 2010

Проблема в [[0]*ln]*lm. Результат состоит из lm ссылок на один и тот же список , поэтому при изменении одной строки все строки изменяются.

Попробуйте:

self.matrix = [[0]*ln for i in xrange(lm)]
2 голосов
/ 13 декабря 2010

Ответы Тима и Экс исправляют вашу ошибку, но этот шаг даже не нужен, вы можете сделать все это в одной строке, используя понимание списка:

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

Вы также можете сказать:

vals = range(6)

в отличие от того, что у вас уже есть. Это приводит в порядок ваш код и делает его более Pythonic.

1 голос
/ 13 декабря 2010

Проблема в том, что self.matrix = [[0]*ln]*lm не дает вам список lm отдельных подсписков, а содержит список lm ссылок на один и тот же список [[0]*ln].

Попробуйте

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

(Если вы используете Python 2, используйте xrange(lm)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...