Поведение списков в Python: a = a + [3] vs a += [3]

Поведение списков в Python: a = a + [3] vs a += [3]

@python_quiz

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

Коротко: в Python операторы + и += для списков выглядят похожими, но действуют по-разному: + создаёт новый список, а += обычно модифицирует существующий (выполняет in-place). Это различие определяет, что увидит переменная, которая была присвоена до операции (алиас).

Исходный код квиза

python

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

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

Демонстрация с id() для наглядности

python

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

Разница между + и +=

  • a = a + [3]

- Создаёт новый список (конкатенация).
- Присваивает новый объект имени a.
- Ссылки, которые указывали на старый список (как b), остаются неизменными.

  • a += [3]

- Вызывает метод __iadd__ у списка; для списков это реализовано как in-place расширение (аналог extend).
- Объект изменяется на месте; все ссылки на него увидят изменения.

Пример с +=

python

Анализ вариантов (кратко)

  • Вариант с выводом начального списка объясним: если создать новый объект при присвоении, другие ссылки остаются на старом объекте, поэтому они не увидят добавления.
  • Вариант с [1, 2, 3] соответствует поведению при in-place изменении через +=.
  • Вариант [3] неверен, так как операция не «заменяет» список на [3], а добавляет элемент(ы).
  • Вариант None неуместен: выражение print(b) явно печатает список, а не None.

Выводы и рекомендации

  • Если вы хотите изменить список и чтобы все алиасы увидели изменение — используйте методы, изменяющие объект на месте (например, list.append, list.extend, или +=).
  • Если нужно создать новый список (не трогая старые ссылки), используйте + или явное копирование (list(a), a.copy(), или срез a[:]).
  • Будьте внимательны с алиасами (несколькими именами, ссылающимися на один объект) — это частая причина неожиданных багов.

Небольшое резюме:

  • + → новый объект, старые ссылки не меняются.
  • += → обычно in-place, все ссылки видят изменения.

Report Page