Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Что будет, если положить в кортеж список?
Быстрый ответ
Этот вопрос касается изменяемости объектов. Кортеж неизменяем, но это касается самой последовательности, а не объектов внутри. Если положить в кортеж список, кортеж останется неизменяемым по структуре, а список внутри останется изменяемым.
Пример
# Создаём кортеж со списком
my_list = [1, 2, 3]
my_tuple = (my_list, "text", 42)
print(my_tuple) # ([1, 2, 3], 'text', 42)
# Что работает
print(my_tuple[0]) # [1, 2, 3] — доступ к элементам работает
print(len(my_tuple)) # 3 — кортеж имеет 3 элемента
# Что НЕ работает (структура неизменяема)
try:
my_tuple[0] = [4, 5, 6] # TypeError
except TypeError as e:
print(f"Ошибка: {e}") # tuple object does not support item assignment
try:
my_tuple[1] = "hello" # TypeError
except TypeError as e:
print(f"Ошибка: {e}")
# Что ДА работает (список изменяем)
my_tuple[0].append(4)
print(my_tuple) # ([1, 2, 3, 4], 'text', 42)
my_tuple[0][0] = 999
print(my_tuple) # ([999, 2, 3, 4], 'text', 42)
my_tuple[0].clear()
print(my_tuple) # ([], 'text', 42)
Почему так происходит
В Python все объекты имеют два свойства:
1. Неизменяемость структуры (кортеж):
tuple_structure = (1, 2, 3)
# Нельзя менять элементы или размер
tuple_structure[0] = 999 # TypeError
tuple_structure[3] = 4 # IndexError
2. Изменяемость содержимого (если объект изменяем):
my_dict = {"a": 1}
my_tuple = (my_dict, "x")
# Сама структура неизменяема
my_tuple[0] = {} # TypeError
# Но объект внутри изменяем
my_dict["b"] = 2
my_tuple[0]["c"] = 3
print(my_tuple) # ({'a': 1, 'b': 2, 'c': 3}, 'x')
Практические примеры
Пример 1: Список в кортеже
coordinates = ([10, 20], [30, 40])
# Нельзя переассайнить координату целиком
coordinates[0] = [50, 60] # TypeError
# Можно менять элементы списка
coordinates[0][0] = 100
print(coordinates) # ([100, 20], [30, 40])
# Можно добавить элемент
coordinates[0].append(50)
print(coordinates) # ([100, 20, 50], [30, 40])
Пример 2: Словарь в кортеже
user_data = (
{"name": "Alice", "age": 30},
"admin"
)
# Неизменяемость кортежа
try:
user_data[0] = {"name": "Bob"} # TypeError
except TypeError:
print("Cannot reassign tuple element")
# Изменяемость словаря
user_data[0]["city"] = "Moscow" # OK
user_data[0]["age"] = 31 # OK
print(user_data) # ({'name': 'Alice', 'age': 31, 'city': 'Moscow'}, 'admin')
Проверка хешируемости
Важный момент: Если в кортеже есть список, кортеж перестаёт быть хешируемым!
# Кортеж из неизменяемых объектов — хеширован
immutable_tuple = (1, 2, 3)
hash(immutable_tuple) # OK
# Кортеж содержит список — не хешируем
mutable_tuple = ([1, 2], 3)
try:
hash(mutable_tuple) # TypeError
except TypeError as e:
print(f"Ошибка: {e}") # unhashable type: 'list'
# Нельзя использовать как ключ словаря
data = {}
data[mutable_tuple] = "value" # TypeError: unhashable type: 'tuple'
# Нельзя добавить в множество
my_set = set()
my_set.add(mutable_tuple) # TypeError: unhashable type: 'tuple'
Правило: Поверхностная неизменяемость
Неизменяемость в Python — поверхностная (shallow):
class Box:
def __init__(self, items):
self.items = items # Можно менять
box = Box([1, 2, 3])
box.items.append(4) # OK
# Для кортежей то же самое
my_tuple = ([1, 2], "text")
my_tuple[0].append(3) # OK
Когда это полезно
# Хорошо: кортеж с неизменяемыми объектами (безопасен)
coordinates = (10, 20, 30) # Действительно неизменяемо
# Плохо: кортеж со списками (ловушка)
data = ([1, 2], [3, 4], [5, 6]) # Выглядит неизменяемым, но нет
# Лучше всего: кортеж кортежей
data = ((1, 2), (3, 4), (5, 6)) # Действительно неизменяемо и хешируемо
# Если нужна мутируемость: используй список списков
data = [[1, 2], [3, 4], [5, 6]] # Явно мутируемо
Вывод
- Кортеж со списком создаётся и работает
- Структура кортежа остаётся неизменяемой — нельзя переассайнить элемент
- Список внутри остаётся изменяемым — можно менять его содержимое
- Такой кортеж не хеширован — нельзя использовать как ключ или в множестве
- Это пример поверхностной неизменяемости — неизменяемость касается структуры, а не содержимого