a += для списков и алиасы в Python
@python_quizРазберем этот квиз
Код, который разбираем:

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

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

Вывод покажет одинаковые id до и после, что подтверждает in-place модификацию.
Чем это отличается от a = a + [4]
Оператор + создаёт новый список (конкатенация) и возвращает его. Присваивание через = переназначает имя a на новый объект, b продолжает ссылаться на старый список:

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

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

Практические советы и подводные камни
- Помните про aliasing: если присвоили
b = a, то любые in-place операции над a (extend, sort, append, += и т.д.) повлияют и на b. - Если нужно независимое копирование списка, используйте:
- срез: b = a[:]
- метод: b = a.copy()
- конструктор: b = list(a)
- Будьте внимательны с аргументами по умолчанию в функциях — часто источник неожиданных зависимостей из-за мутируемых объектов.
Краткий вывод
a += для списков модифицирует список на месте, а присваивание b = a создаёт вторую ссылку на тот же объект. Это даёт тот же изменённый список при печати обоих имён. Если нужно избежать совместных изменений — явным образом копируйте список или используйте операции, возвращающие новый объект.