Как я могу не влиять на этот список в моей функции? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь создать функцию, которая получает список, представляющий матрицу, и возвращает умноженную новую матрицу на полученное число (скаляр). Старая матрица должна остаться без изменений.

Я пытаюсь это сделать:

def mul_mat_by_scalar(mat, alpha):
    new_mat = mat[:]
    for row in range(len(mat)):
        for col in range(len(mat[row])):
            new_mat[row][col] = alpha * mat[row][col]
    return new_mat

, но кажется, что мат тоже изменился. Я думаю, что new_mat - это новый объект списка, который ссылается на те же «подсписки» в mat, поэтому mat изменяется, потому что изменяются его подсписки.

Я прав? Как я могу это исправить?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Я нашел решение для копирования матрицы:

new_mat = [row[:] for row in mat]

Спасибо в любом случае !

1 Ответ

0 голосов
/ 07 апреля 2020

Часто, если переменная содержит другие переменные (например, список с вложенными списками), на внутренние переменные ссылаются через своего рода указатель. Таким образом, когда вы делаете копию, вы получаете то, что называется мелкой копией, где каждый внутренний объект в оригинале и копии являются одинаковыми объектами, в отличие от явной копии на каждом вложенном слое.

Чтобы обойти это, одним из подходов является использование deepcopy через модуль copy:

from copy import deepcopy

def mul_mat_by_scalar(mat, alpha):
    new_mat = deepcopy(mat)
    for row in range(len(mat)):
        for col in range(len(mat[row])):
            new_mat[row][col] = alpha * mat[row][col]
    return new_mat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...