Выбор ответа Senior Типы, изменяемость и сравнение обновлено

Загадка += над списком в кортеже

Вопрос

Что произойдёт при выполнении кода?

t = ([1],)
t[0] += [2]

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: TypeError, но t[0] станет [1, 2]. t[0] += [2] раскладывается на два шага: t[0].iadd([2]) расширяет список на месте, а затем t[0] = результат пытается присвоить элемент кортежа и падает с TypeError.

Варианты ответа

  1. TypeError, и t не изменится
  2. TypeError, но t[0] станет [1, 2]правильный ответ
  3. Ошибки нет, t[0] станет [1, 2]
  4. Ошибки нет, t не изменится

Разбор

t[0] += [2] раскладывается на два шага: t[0].__iadd__([2]) расширяет список на месте, а затем t[0] = результат пытается присвоить элемент кортежа и падает с TypeError. Первый шаг уже выполнен, поэтому список изменился, хотя пользователь увидел ошибку. Это известная особенность модели «расширенное присваивание = операция + присваивание».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме