Проблемы с выводом матрицы
Создал класс матриц, и некоторые методы инициализации, вывода и прочее. Но при попытке заменить элемент с помощью метода 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]