Поведение списков в Python: a = a + [3] vs a += [3]
@python_quizРазберем этот квиз
Коротко: в Python операторы + и += для списков выглядят похожими, но действуют по-разному: + создаёт новый список, а += обычно модифицирует существующий (выполняет in-place). Это различие определяет, что увидит переменная, которая была присвоена до операции (алиас).
Исходный код квиза

Что происходит по шагам
- a = [1, 2] — создаётся список [1, 2], имя a указывает на него.
b = a— b теперь ссылается на тот же объект, что и a.a = a+ [3] — оператор+создаёт новый список, результат (новый объект) присваивается имени a. Переменная b продолжает ссылаться на старый объект.- print(b) — печатает содержимое старого объекта, то есть [1, 2].
Демонстрация с id() для наглядности

Ожидаемый вывод (пример)

Разница между + и +=
a = a + [3]
- Создаёт новый список (конкатенация).
- Присваивает новый объект имени a.
- Ссылки, которые указывали на старый список (как b), остаются неизменными.
a += [3]
- Вызывает метод __iadd__ у списка; для списков это реализовано как in-place расширение (аналог extend).
- Объект изменяется на месте; все ссылки на него увидят изменения.
Пример с +=

Анализ вариантов (кратко)
- Вариант с выводом начального списка объясним: если создать новый объект при присвоении, другие ссылки остаются на старом объекте, поэтому они не увидят добавления.
- Вариант с [1, 2, 3] соответствует поведению при in-place изменении через
+=. - Вариант [3] неверен, так как операция не «заменяет» список на [3], а добавляет элемент(ы).
- Вариант None неуместен: выражение
print(b)явно печатает список, а не None.
Выводы и рекомендации
- Если вы хотите изменить список и чтобы все алиасы увидели изменение — используйте методы, изменяющие объект на месте (например,
list.append,list.extend, или+=). - Если нужно создать новый список (не трогая старые ссылки), используйте
+или явное копирование (list(a),a.copy(), или срезa[:]). - Будьте внимательны с алиасами (несколькими именами, ссылающимися на один объект) — это частая причина неожиданных багов.
Небольшое резюме:
+→ новый объект, старые ссылки не меняются.+=→ обычно in-place, все ссылки видят изменения.