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

Когда лучше использовать кортеж?

1.0 Junior🔥 161 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда использовать кортежи

Кортеж (tuple) — неизменяемая (immutable) последовательность в Python. Это фундаментальное отличие от списков, и оно определяет, когда его использовать.

Основное отличие: неизменяемость

# Список (изменяемый)
lst = [1, 2, 3]
lst[0] = 10  # ✅ Можно менять
lst.append(4)  # ✅ Можно добавлять

# Кортеж (неизменяемый)
tpl = (1, 2, 3)
tpl[0] = 10  # ❌ TypeError: tuple object does not support item assignment
tpl.append(4)  # ❌ AttributeError: tuple object has no attribute append

1. Когда значения не должны меняться

Координаты, пары ключ-значение:

# Хорошо — кортеж, т.к. координаты неизменяемы
point = (10, 20)
color = (255, 128, 0)  # RGB

# Плохо — список, т.к. координаты могут случайно измениться
point = [10, 20]

Возврат нескольких значений:

def divmod_custom(a, b):
    return (a // b, a % b)  # Кортеж — удобно и выразительно

quotient, remainder = divmod_custom(17, 5)

2. Использование в качестве ключей словаря

Кортежи хешируемы, списки — нет:

# ✅ Работает — кортеж неизменяемый
locations = {(0, 0): "Origin", (1, 1): "Corner"}
print(locations[(0, 0)])  # Origin

# ❌ Ошибка — список не хешируется
locations = {[0, 0]: "Origin"}  # TypeError: unhashable type: list

Словарь из кортежей:

user_coords = {
    (37.7749, -122.4194): "San Francisco",
    (40.7128, -74.0060): "New York",
}

for coord, city in user_coords.items():
    print(f"Город {city} в координатах {coord}")

3. Использование в множествах

Множество может содержать только хешируемые объекты:

# ✅ Работает
points = {(0, 0), (1, 1), (2, 2)}
if (1, 1) in points:
    print("Точка найдена")

# ❌ Ошибка
points = {[0, 0], [1, 1]}  # TypeError: unhashable type: list

4. Защита от случайных изменений

Приватные данные функции:

def create_immutable_config():
    return ("host", "localhost", 5432)  # Гарантия: никто не изменит

host, address, port = create_immutable_config()
# Невозможно случайно изменить

Параметры функции:

# Если функция ожидает неизменяемый набор, требуй кортеж
def process_rgb(color: tuple[int, int, int]) -> str:
    r, g, b = color
    return f"RGB({r},{g},{b})"

process_rgb((255, 0, 0))  # ✅
process_rgb([255, 0, 0])  # Можно, но семантически неправильно

5. Производительность

Кортежи быстрее списков:

import timeit

# Создание кортежа быстрее
print(timeit.timeit("x = (1, 2, 3)", number=1000000))  # ~0.04s
print(timeit.timeit("x = [1, 2, 3]", number=1000000))  # ~0.08s

# Итерация примерно одинакова
print(timeit.timeit("for i in (1,2,3,4,5): pass", number=1000000))  # ~0.08s
print(timeit.timeit("for i in [1,2,3,4,5]: pass", number=1000000))  # ~0.09s

Разница не критична для большинства приложений, но кортежи занимают меньше памяти.

6. Распаковка и присваивание

Кортежи удобны для множественного возврата:

# Ясно и читаемо
def get_user_info():
    return ("John", 30, "john@example.com")

name, age, email = get_user_info()

# С игнорированием значения
name, _, email = get_user_info()

# Со сборкой остатка
first, *rest = get_user_info()

7. Named Tuples для структурированных данных

Более явная альтернатива простых кортежей:

from collections import namedtuple

Point = namedtuple(Point, [x, y])
p = Point(10, 20)
print(p.x, p.y)  # 10 20

# Или в Python 3.7+:
from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(10, 20)

Сравнение: список vs кортеж

ХарактеристикаСписокКортеж
ИзменяемостьДаНет
ХешируемостьНетДа (если элементы хешируемы)
Скорость созданияМедленнееБыстрее
Использование как ключНетДа
ПамятьБольшеМеньше
Защита данныхНетДа
Метод append()ЕстьНет

Когда НЕ использовать кортежи

# ❌ Плохо — часто нужны изменения
data = (1, 2, 3, 4, 5)
data[0] = 10  # Ошибка!

# ✅ Хорошо — используй список
data = [1, 2, 3, 4, 5]
data[0] = 10  # OK
data.append(6)  # OK

Итоги

Используй кортежи когда:

  1. Данные не должны меняться (координаты, RGB цвета)
  2. Нужно использовать как ключ словаря или элемент множества
  3. Хочешь защитить данные от случайных изменений
  4. Возвращаешь несколько значений из функции
  5. Важна производительность и экономия памяти

Если нужна частая модификация — используй список. Кортежи — это инструмент для выражения намерения "эти данные не меняются".

Когда лучше использовать кортеж? | PrepBro