Возникнет 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 не означает глубокую неизменяемость его содержимого.