Почему список n принимает значения списка b, если я создал список b, как b = list(n)

Я создал две матрицы (n и b), где матрица n должна быть неизменяемой и должна хранить введенные числа, а в матрице b должны происходить изменения, основываясь на данных из матрицы n ( число b[i][j] является суммой 4-х соседних чисел (сверху, справа, снизу, слева). Чтобы матрица n всегда оставалась в изначальном состоянии (с момента ввода чисел), я сделал ее копию b с помощью b = list(n), что, по сути, должно оставить матрицу n в покое. Но в итоге, по ходу действия программы, матрица n принимает значения матрицы b. В результате код работает неправильно, так как все значения увеличиваются в арифметической прогрессии. Почему так происходит и как это исправить?

i = 0
n = []
while True:
    n.append(input().split())
    if ["end"] in n:
        n.remove(["end"])
        break
for i in range(len(n)):
    for j in range(len(n[i])):
        n[i][j] = int(n[i][j])
b = list(n)
for i in range(len(b)):
    for j in range(len(b[i])):
        b[i][j] = 0
        b[i][j] += n[i - 1][j] + n[i][j - 1]
        if i + 1 == len(b):
            b[i][j] += n[0][j]
        else:
            b[i][j] += n[i + 1][j]
        if j + 1 == len(b[j]):
            b[i][j] += n[i][0]
        else:
            b[i][j] += n[i][j + 1]
        print(b[i][j], end=" ")
    print()

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

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

list копирует только элементы верхнего уровня. У вас есть вложенные списки, они так не копируются, копируются ссылки на них же. Используйте deepcopy, чтобы скопировать вложенные списки:

from copy import deepcopy

b = deepcopy(n)
→ Ссылка