Копирование значений и ссылки на список
Копирование значений и передача ссылок на список: как устроены независимые копии, общая память и изменение элементов в понятном примере.

Предмет
При передаче списка в функцию или присвоении его переменной язык может скопировать содержимое или передать указатель на уже существующие данные. От этого выбора зависит, повлияет ли изменение одного списка на другой. Разбор строится на общем понятии списка и не привязан к конкретному синтаксису или функции.
Представление данных
Представим список из трёх чисел: 10, 20, 30. Копирование значений задаёт выбранную семантику: переменная получает собственное содержимое, и изменение первого элемента копии до 99 не затрагивает исходный список. Передача ссылки не дублирует числа: обе переменные указывают на один и тот же блок памяти, поэтому запись 99 в первый элемент будет видна через обе переменные. Важно, что семантическая независимость не означает, что каждая копия всегда занимает отдельный физический блок памяти; реализации могут применять разные стратегии хранения, например отложенное копирование или общую память с контролем изменений. Разница между режимами определяется семантикой операции, а не гарантией физического размещения.
Владелец и мутации
Термин «владелец» описывает, кто управляет данными. Если список передаётся по значению, получатель работает с собственной копией и может менять её элементы без последствий для исходника. Если передаётся ссылка, получатель получает доступ к общему ресурсу, и каждое изменение затрагивает всех, кто на него смотрит. Мутация — это изменение содержимого без создания нового объекта: смена элемента, добавление, удаление. В режиме ссылок мутация распространяется на всех участников; в режиме копий — только на владельца копии. При этом удержание ссылки не переносит владение автоматически: две переменные могут одновременно ссылаться на один объект, и ни одна из них не является единственным владельцем. Передача ссылки по значению копирует сам указатель, но не объект, на который он указывает. Переприсвоение переменной — замена ссылки на другой объект — отличается от мутации: после переприсвоения первая переменная может указывать на новый список, а вторая продолжает смотреть на прежний.
Пример
Псевдокод для наглядности: исходный список называется a и содержит 10, 20, 30. Переменная b получает копию значений a. Далее b получает новый первый элемент 99. Вывод a показывает 10, 20, 30, а вывод b показывает 99, 20, 30. Теперь переменная c получает ссылку на a. Изменение первого элемента через c до 77 делает вывод a равным 77, 20, 30, а вывод b остаётся 99, 20, 30. Так видно, что копия изолирована, а ссылка объединяет данные.
Ограничения
Реальные языки и среды не делятся на те, что всегда копируют списки, и те, что всегда передают ссылки. Конкретное поведение зависит от типа данных, выбранной операции и контракта функции или метода. Глубокие структуры с вложенными списками усложняют картину, потому что верхний уровень может копироваться, а вложенные элементы оставаться общими. Семантическая независимость списков не гарантирует, что их содержимое физически отделено: при поверхностном копировании вложенные объекты могут остаться общими. Конкретное поведение всегда определяется документацией языка или среды, а не общим правилом.
Практический вывод
Перед передачей списка стоит решить, нужна ли изоляция или совместное использование. Изоляция безопаснее при обработке данных, которые не должны меняться у отправителя. Общие ссылки позволяют избежать дублирования содержимого и дают нескольким частям программы наблюдать одни и те же изменения, но требуют явной координации: нужно понимать, кто и когда изменяет общий объект, и учитывать правила жизненного цикла. Понимание того, какой режим действует в конкретной операции, предотвращает неожиданные изменения данных.