Проблемы с выводом матрицы

Создал класс матриц, и некоторые методы инициализации, вывода и прочее. Но при попытке заменить элемент с помощью метода set_element, меняются значения всех элементов в данном столбце. Опытами выяснил что проблема в инициализации вложенного списка. Подскажите с чем это связано?

class Matrix:
    def __init__(self, rows, cols):
        self.rows = rows #строки
        self.cols = cols #столбцы 
        self.matrix = [[0]*cols]*rows
    def __str__(self):
        lines = []
        for row in self.matrix:
            lines.append(' '.join(str(x) for x in row))
        return '\n'.join(lines)
    def get_element(self, row, col):
        return self.matrix[row][col]
    def set_element(self, row, col, value):
        self.matrix[row][col] = value
a = Matrix(5, 5)
print(a)
a.set_element(2, 2, 3)

print()
print(a)

Вывод:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 3 0 0
0 0 3 0 0
0 0 3 0 0
0 0 3 0 0
0 0 3 0 0

Ответы (1 шт):

Автор решения: Amgarak

Проблема связана с тем, что вы неправильно инициализируете вложенный список в конструкторе. И у вас получается, что вы создаете ссылки на один и тот же список в каждой строке, что приводит к изменению всех списков.

class Matrix:
    def __init__(self, rows, cols):
        self.rows = rows
        self.cols = cols
        self.matrix = [[0] * cols for _ in range(rows)]

    def __str__(self):
        lines = []
        for row in self.matrix:
            lines.append(' '.join(str(x) for x in row))
        return '\n'.join(lines)

    def get_element(self, row, col):
        return self.matrix[row][col]

    def set_element(self, row, col, value):
        self.matrix[row][col] = value

a = Matrix(5, 5)
print(a)
a.set_element(2, 2, 3)
print()
print(a)

Используйте генератор списка вместо повторения ссылки. Таким образом, вы создадите независимые списки для каждой строки в матрице.

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 3 0 0
0 0 0 0 0
0 0 0 0 0

[Program finished]
→ Ссылка