TGViewer
Python: задачки и вопросы Python: задачки и вопросы @quiz_python · 6.93K subscribers
Post #4518 686
Развёрнутое пояснение

1️⃣Переменная 𝚝 указывает на кортеж с одним элементом — списком [𝟷, 𝟸]; сам кортеж неизменяем, но список внутри него — изменяемый объект.

2️⃣Выражение t[0] += [3] разворачивается примерно в t[0] = t[0].__iadd__([3]): сначала вызывается метод __iadd__ у списка, который добавляет элемент 𝟹 на месте и возвращает тот же самый изменённый список.

3️⃣Затем интерпретатор пытается выполнить присваивание t[0] = ..., но кортеж не поддерживает присваивание элементов, поэтому выбрасывается TypeError: 'tuple' object does not support item assignment.

4️⃣Однако к моменту исключения список уже был изменён методом __iadd__, поэтому если после ошибки проверить значение 𝚝, оно будет ([1, 2, 3],) — мутация произошла, несмотря на ошибку.

Почему это важно
Задача показывает, что составные операторы вроде += — это не атомарная операция, а последовательность из нескольких шагов, и сбой на одном из них не откатывает предыдущие. Это учит быть осторожнее при работе с вложенными изменяемыми объектами внутри неизменяемых контейнеров и помнить, что «неизменяемость» кортежа распространяется только на его структуру, а не на содержимое элементов.
  • 👍 6
  • 😱 3
More from @quiz_python
  1. Sep 22, 2026Развёрнутое пояснение: 1. Вызов build_batch создаёт генератор, но его тело пока не исполня…
  2. Sep 22, 2026Post #4884
  3. Sep 22, 2026Развёрнутое пояснение: 1. Вызывается load_config, управление переходит в блок try. 2. Перв…
  4. Sep 22, 2026Post #4882
  5. Sep 21, 2026Развёрнутое пояснение: 1. make_handlers создаёт пустой список handlers. 2. Цикл дважды при…
  6. Sep 21, 2026Post #4880
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →