← Все вопросы

Про копирование списков

Задан 2 месяца назад38 просмотров2 ответа
0

Если я сделаю list2 = list1 в Python или const arr2 = arr1 в JS, а потом изменю list2, то у меня изменится и list1. Почему так происходит и как сделать настоящую копию?

2 ответа

1

Потому что в обеих строчках копируется не список, а ссылка на него. list2 = list1 означает «пусть имя list2 указывает на тот же объект». Объект один, имён два — отсюда и эффект.

Настоящая копия в Python:

list2 = list1.copy()      # или list(list1), или срез list1[:]

В JS:

const arr2 = [...arr1];   // или arr1.slice()

Проверить легко: id(list1) == id(list2) — у настоящей копии id другой.

Одна ловушка: это поверхностная копия. Если внутри лежат другие списки, скопируется только «верхний этаж», вложенные останутся общими.

1

Про вложенные структуры добавлю, потому что сама на этом попалась. Держала таблицу как список списков, сделала rows.copy(), поменяла ячейку в копии — и она же поменялась в оригинале. Поверхностная копия копирует только внешний список.

Для таких случаев есть deepcopy:

import copy
rows2 = copy.deepcopy(rows)

Медленнее, зато копирует всю вложенность. В JS аналог — structuredClone(arr).

Ваш ответ

, чтобы ответить на вопрос.