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

В каких случаях предпочтительнее использовать список, а в каких — кортеж

1.6 Junior🔥 171 комментариев
#Python Core

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

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

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

Список vs Кортеж

Оба типа используются для хранения последовательности элементов, но имеют разные характеристики и применяются в разных ситуациях.

Основные различия

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

# Кортеж — неизменяемый (immutable)
my_tuple = (1, 2, 3)
# my_tuple[0] = 10       # TypeError! Нельзя менять
# my_tuple.append(4)     # AttributeError! Нет метода append()

Когда использовать СПИСОК

1. Когда данные изменяются

# Накопление результатов
results = []
for i in range(10):
    results.append(i * 2)  # Список подходит идеально

2. Когда нужны методы для модификации

scores = [85, 92, 78]
scores.sort()           # Сортировка
scores.reverse()        # Разворот
scores.insert(1, 88)    # Вставка

3. Для больших изменяемых коллекций

users = []              # Добавление пользователей
products = []           # Список товаров
events = []             # История событий

4. Когда нужна большая производительность при изменении

# Список быстрее при многих операциях добавления/удаления
data = list(range(1000000))
data.pop(0)  # Операции на списке работают в среднем

Когда использовать КОРТЕЖ

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

# Координаты, которые не изменяются
location = (55.7558, 37.6173)  # Москва
# location[0] = 55.7560  # Ошибка! Защита от случайного изменения

2. Как ключи словаря

# Список нельзя использовать как ключ (unhashable)
coordinates_dict = {}
coordinates_dict[(10, 20)] = "Point A"  # OK — кортеж hashable
# coordinates_dict[[10, 20]] = "Point A"  # TypeError!

3. Как элементы множества

set_of_points = {(0, 0), (1, 1), (2, 2)}  # OK
# set_of_lists = {[0, 0], [1, 1]}  # TypeError!

4. Для возврата нескольких значений из функции

def get_user_info():
    return "Alice", 30, "alice@example.com"  # Кортеж

name, age, email = get_user_info()  # Красивое распаковывание

# Альтернатива со списком выглядит менее интуитивно

5. Защита от случайного изменения

# Конфигурация, которая не должна меняться
REQUIRED_FIELDS = ("name", "email", "phone")
# REQUIRED_FIELDS[0] = "id"  # TypeError! Защита от ошибок

# Со списком случайно можно изменить
required_fields = ["name", "email", "phone"]
required_fields[0] = "id"  # Ошибка не будет поймана на уровне типов

6. Производительность памяти

import sys

list_val = [1, 2, 3, 4, 5]
tuple_val = (1, 2, 3, 4, 5)

print(sys.getsizeof(list_val))   # 56 байт
print(sys.getsizeof(tuple_val))  # 40 байт — кортеж компактнее

7. Функции, которые гарантируют неизменяемость

def process_sequence(data: tuple) -> None:
    """Функция гарантирует, что не изменит данные"""
    # Типизация показывает намерение: это не должно меняться
    pass

process_sequence((1, 2, 3))  # Явное указание неизменяемости

Сравнительная таблица

ПараметрСписокКортеж
ИзменяемостьДа (mutable)Нет (immutable)
ПроизводительностьМедленнее при работеБыстрее, компактнее
Ключ словаряНет ❌Да ✓
Элемент множестваНет ❌Да ✓
Методы для измененияappend, extend, pop...Нет
Thread-safetyНужна синхронизацияБезопасен по умолчанию
ПамятьБольшеМеньше

Практические примеры

# Пример 1: Обработка координат
points = [(0, 0), (1, 1), (2, 2)]  # Кортежи в списке
for x, y in points:
    print(f"Point: {x}, {y}")

# Пример 2: Кэширование функции
from functools import lru_cache

@lru_cache(maxsize=128)
def expensive_function(data):
    # Работает с tuple, но не со списком!
    return sum(data)

expensive_function((1, 2, 3))    # OK
# expensive_function([1, 2, 3])  # TypeError

# Пример 3: Распаковывание
def process_record(record):
    id, name, status = record  # Работает с кортежем
    return f"{id}: {name} ({status})"

result = process_record((1, "Alice", "active"))

Вывод

  • Список — для изменяемых данных, коллекций, которые растут/сжимаются
  • Кортеж — для фиксированных данных, ключей, защиты от изменений

Выбор между ними — это один из первых шагов проектирования структуры данных в программе.