Какой вывод получит программа при попытке изменить кортеж?

Возникнет TypeError, и print не выполнится. При этом вложенный список уже изменится на ['bee', 'geek']: += сначала мутирует list, затем пытается записать его обратно в tuple.

Короткий ответ

Что ответить на собеседовании

Возникнет TypeError, и print не выполнится. При этом вложенный список уже изменится на ['bee', 'geek']: += сначала мутирует list, затем пытается записать его обратно в tuple.

Подробный разбор

Ответ с пояснениями

Условие

Определите, что будет напечатано в консоль после выполнения следующего кода. В коде производится попытка изменить кортеж, добавив элемент в вложенный список.


data = (['bee'], 'pygen')
data[0] += ['geek']
print(data)

Ответ

Возникнет TypeError, и print не выполнится. При этом вложенный список уже изменится на ['bee', 'geek']: += сначала мутирует list, затем пытается записать его обратно в tuple.

Расширенное присваивание выполняется не как одна неделимая операция. Сначала вызывается списочное добавление на месте, поэтому 'geek' попадает в data[0]. Затем Python пытается присвоить результат обратно элементу кортежа, а это запрещено.

Если перехватить исключение и посмотреть data, будет:

(['bee', 'geek'], 'pygen')

В исходном непрерывном выполнении эта строка не печатается. Для разрешённой мутации вложенного списка используйте data[0].extend(['geek']): тогда нет присваивания элементу самого кортежа. Неизменяемость tuple не означает глубокую неизменяемость его содержимого.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее