Почему меняется вся матрица?

При работе с матрицами в Python важно понимать, что операции над ними могут изменять саму матрицу. Это связано с особенностью работы со ссылками и изменяемыми объектами в языке.

Когда вы создаете матрицу, она представляет собой двумерное массив-объект, состоящий из ссылок на другие объекты (в данном случае числа или другие объекты). Если вы выполняете операции над элементами матрицы или над самой матрицей, то возможно изменение данных, на которые указывают ссылки.

Рассмотрим следующий пример:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
row = matrix[1]
row[0] = 0
print(matrix)

В этом примере мы создаем матрицу matrix размером 3x3. Затем мы присваиваем переменной row ссылку на строку с индексом 1 матрицы, то есть на [4, 5, 6]. Затем мы изменяем значение первого элемента row на 0. При выводе матрицы matrix на экран мы увидим следующий результат:

[[1, 2, 3], [0, 5, 6], [7, 8, 9]]

Как видно из результатов, значение первого элемента второй строки (row) изменилось на 0. Это произошло из-за того, что row ссылается на ту же строку, что и matrix[1], и изменение элемента в row привело к изменению значение в матрице matrix.

Чтобы избежать такого поведения, необходимо создавать копию матрицы или строки перед операциями, которые могут изменить значения. Например:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
row = matrix[1].copy()
row[0] = 0
print(matrix)

В этом случае мы создаем копию строки matrix[1], присваиваем ее переменной row и изменяем значение первого элемента на 0. Результат будет следующим:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Как видно из результатов, матрица matrix осталась неизменной.

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