Про копирование списков
Если я сделаю list2 = list1 в Python или const arr2 = arr1 в JS, а потом изменю list2, то у меня изменится и list1. Почему так происходит и как сделать настоящую копию?
2 ответа
Потому что в обеих строчках копируется не список, а ссылка на него. list2 = list1 означает «пусть имя list2 указывает на тот же объект». Объект один, имён два — отсюда и эффект.
Настоящая копия в Python:
list2 = list1.copy() # или list(list1), или срез list1[:]
В JS:
const arr2 = [...arr1]; // или arr1.slice()
Проверить легко: id(list1) == id(list2) — у настоящей копии id другой.
Одна ловушка: это поверхностная копия. Если внутри лежат другие списки, скопируется только «верхний этаж», вложенные останутся общими.
Про вложенные структуры добавлю, потому что сама на этом попалась. Держала таблицу как список списков, сделала rows.copy(), поменяла ячейку в копии — и она же поменялась в оригинале. Поверхностная копия копирует только внешний список.
Для таких случаев есть deepcopy:
import copy
rows2 = copy.deepcopy(rows)
Медленнее, зато копирует всю вложенность. В JS аналог — structuredClone(arr).