a += для списков и алиасы в Python

a += для списков и алиасы в Python

@python_quiz

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

Код, который разбираем:

python

Что выводит этот код и почему

  • b присваивается как ссылка на тот же объект, что и a — они оба указывают на один список в памяти.
  • Оператор += для списков реализован через in-place расширение (list.__iadd__), то есть список модифицируется на месте, не создаётся новый объект.
  • Поскольку модифицируется сам объект, и a, и b видят изменения.

Результат выполнения:

text

Демонстрация с id() — видно, что объект тот же:

python

Вывод покажет одинаковые id до и после, что подтверждает in-place модификацию.

Чем это отличается от a = a + [4]

Оператор + создаёт новый список (конкатенация) и возвращает его. Присваивание через = переназначает имя a на новый объект, b продолжает ссылаться на старый список:

python

Здесь id(a) изменится, id(b) останется прежним, и вывод будет:

text

Поведение для неизменяемых типов

Для неизменяемых типов (например, tuple) операция += не может изменить объект на месте — создаётся новый объект и имя переназначается:

python

Практические советы и подводные камни

  • Помните про aliasing: если присвоили b = a, то любые in-place операции над a (extend, sort, append, += и т.д.) повлияют и на b.
  • Если нужно независимое копирование списка, используйте:

- срез: b = a[:]
- метод: b = a.copy()
- конструктор: b = list(a)

  • Будьте внимательны с аргументами по умолчанию в функциях — часто источник неожиданных зависимостей из-за мутируемых объектов.

Краткий вывод

a += для списков модифицирует список на месте, а присваивание b = a создаёт вторую ссылку на тот же объект. Это даёт тот же изменённый список при печати обоих имён. Если нужно избежать совместных изменений — явным образом копируйте список или используйте операции, возвращающие новый объект.

Report Page