Разница создания матрицы

matrix = [[0 * n] * n

Почему когда создаю матрицу таким способом matric = [[0 * n] * n при замене одного из индексов в списке, в других списках этот же индекс меняется, я слышал, что там работает ссылочный метод вроде, но хочу почитать почему так работает. И когда создаю через matric = [[0 for _ in range(n)] for _ in range(n)], всё нормально работает. Почему это работает именно так?


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

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

Дело в том, что список - это ссылочный тип данных, и в matrix на самом деле содержится не n списков, а n копий одного и того же списка.

Ссылка в программировании — это объект, указывающий на определённые данные, но не хранящий их. Получение объекта по ссылке называется разыменованием.

n = 10

a = [0 for _ in range(n)]
b = [0 for _ in range(n)]
print(a is b) # False, это разные списки

a = [0 for _ in range(n)]
b = a
print(a is b) # True, это один список

Правильный способ создания двумерного списка:

matrix = [[0] * n for _ in range(n)]
matrix = [[0 for _ in range(n)] for _ in range(n)]
→ Ссылка