← Назад к вопросам

Что будет если положить в кортеж список?

2.0 Middle🔥 191 комментариев
#Python Core

Комментарии (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]]  # Явно мутируемо

Вывод

  1. Кортеж со списком создаётся и работает
  2. Структура кортежа остаётся неизменяемой — нельзя переассайнить элемент
  3. Список внутри остаётся изменяемым — можно менять его содержимое
  4. Такой кортеж не хеширован — нельзя использовать как ключ или в множестве
  5. Это пример поверхностной неизменяемости — неизменяемость касается структуры, а не содержимого