← Все вопросы

Почему можно изменить кортеж, содержащий список?

Задан 2 месяца назад12 просмотров1 ответ
0

t = (1, 2, [3, 4]) t[2].append(5) print(t) # (1, 2, [3, 4, 5])

Но это вызывает ошибку:

t[0] = 10 # TypeError: 'tuple' object does not support item assignment

Кортеж же неизменяемый! Почему первый пример работает, а второй — нет? Как это согласуется с "неизменяемостью" кортежей?

1 ответ

0

неизменяемость кортежа означает, что нельзя поменять, на какие объекты он ссылается — то есть нельзя сделать t[0] = 10, подменить элемент другим объектом. отсюда TypeError.

но t[2].append(5) элемент не подменяет. t[2] как был тем же списком, так и остался — ты меняешь сам список внутри, а не то, на что ссылается кортеж. для кортежа ничего не поменялось: в ячейке лежит ссылка на тот же список, просто список стал длиннее.

грубо: кортеж «замораживает» свои ячейки (что в них лежит — не поменять), но не замораживает содержимое изменяемых объектов внутри. кстати из-за этого кортеж со списком внутри уже не по-настоящему неизменяемый — и его нельзя использовать как ключ словаря или элемент множества, он не хешируется

Ваш ответ

, чтобы ответить на вопрос.