Понимание ссылок и копий списков в Python

Понимание ссылок и копий списков в Python

@python_quiz

Разберем этот квиз

Коротко: в Python переменные хранят ссылки на объекты. Для изменяемых объектов (например, списков) присвоение не создаёт копию — оно просто даёт новую ссылку на тот же объект. Это ключ к пониманию поведения кода из квиза.

Условие (код)

python

Что происходит по шагам

  1. Создаётся словарь data с ключом "nums", значение — список [1, 2].
  2. ref = data["nums"] — переменная ref получает ссылку на тот же список.
  3. data["copy"] = data["nums"] — в словарь по ключу "copy" записывается та же ссылка на список (копии нет).
  4. ref.append(3) — метод append изменяет объект списка на месте; все ссылки на этот список «видят» изменение.
  5. print выводит текущее состояние списка, на который ссылаются data["nums"] и data["copy"].

Итог: оба вывода будут [1, 2, 3].

Демонстрация идентичности объектов

Чтобы убедиться, что все три ссылки указывают на один объект, можно проверить id или сравнение по тождеству:

python

Ожидаемый вывод (id будут одинаковыми, True/True):

Почему другие варианты ответов неверны (короткий разбор)

  • Вариант с [1, 2, 3] [1, 2] предполагал бы, что только data["nums"] поменялся, а data["copy"] остался прежним — это неверно, потому что data["copy"] хранит ссылку на тот же список.
  • Вариант с [1, 2] [1, 2, 3] тоже противоречит логике ссылок: изменение через ref повлияет на все ссылки на объект.
  • Вариант с [1, 2] [1, 2] означал бы отсутствие изменений — тоже неверно, ведь append изменил список.

Как получить «независимую» копию списка

Если нужна реальная копия, используйте один из способов копирования:

  • Поверхностная копия (создаётся новый список; вложенные изменяемые объекты при этом разделяются):

- срез: copied = original[:]
- метод: copied = original.copy()
- конструктор списка: copied = list(original)

  • Глубокая копия (копирует вложенные структуры):

`python
import copy
deep_copy = copy.deepcopy(original)
`

Пример изменения кода, чтобы data["copy"] был отдельным списком:

python

Результат будет:

Вывод

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

Report Page