Можно ли положить список в неизменяемый кортеж и как это влияет на изменяемость
Что проверяют
Понимаете ли вы, что неизменяемость в Python относится к связям, а не к содержимому объектов. Вопрос короткий, но по ответу видно, представляет ли кандидат модель памяти языка или знает правило наизусть.
Как отвечать
Положить можно, кортеж хранит ссылки на объекты. Неизменяемость означает лишь то, что нельзя заменить сами ссылки: добавить, удалить или переприсвоить элемент. Объект по ссылке живёт своей жизнью, и список внутри кортежа меняется как обычно.
t = ([1, 2], 3)
t[0].append(4) # ок, теперь ([1, 2, 4], 3)
t[0] = [] # TypeErrorПрактическое следствие, ради которого вопрос и задают: такой кортеж перестаёт быть хешируемым. Хеш кортежа считается по хешам элементов, у списка его нет, поэтому hash(t) бросает TypeError. Значит кортеж со списком внутри нельзя сделать ключом словаря, положить в множество или передать в функцию с кешированием по аргументам. Нужен ключ, значит и вложенное значение должно быть неизменяемым: кортеж вместо списка, frozenset вместо множества.
Где спотыкаются
Классика с составным присваиванием: строка t[0] += [4] и меняет список, и тут же бросает TypeError. Операция составная: список расширяется на месте, а потом интерпретатор пытается присвоить результат обратно в кортеж и получает отказ. Мутация к этому моменту уже произошла, и данные оказываются изменены при видимой ошибке.
Второе: считают кортеж защитой от изменений при передаче данных наружу. Функция получает те же ссылки и спокойно правит вложенный список у вас под ногами. Настоящая защита это либо копия, либо неизменяемые элементы внутри.
Третье: уверенно заявляют, что кортеж всегда хешируем, и не связывают это с кешем по аргументам. Декоратор кеширования хеширует всё, что ему передали, и падает ровно на таком аргументе.