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

В чём разница между списком (list) и кортежем (tuple) в Python?

1.3 Junior🔥 281 комментариев
#Python Core

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

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

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

Разница между списком и кортежем в Python

Две самые важные встроенные коллекции для хранения последовательности элементов — это список (list) и кортеж (tuple). Хотя они похожи на первый взгляд, они имеют фундаментальные различия, которые влияют на выбор между ними в разных сценариях.

1. Изменяемость (Mutability) — основное различие

Список (list) — изменяемый:

my_list = [1, 2, 3]
my_list[0] = 100  # ✓ Можно изменять элементы
my_list.append(4)  # ✓ Можно добавлять
my_list.pop()      # ✓ Можно удалять
print(my_list)     # [100, 2, 3]

Кортеж (tuple) — неизменяемый:

my_tuple = (1, 2, 3)
my_tuple[0] = 100  # ✗ TypeError: tuple object does not support item assignment
my_tuple.append(4)  # ✗ AttributeError: tuple object has no attribute append

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

Кортежи более эффективны:

  • Кортежи оптимизированы для Python — используют меньше памяти
  • Списки требуют больше памяти для хранения дополнительной информации о возможности расширения
import sys

my_list = [1, 2, 3]
my_tuple = (1, 2, 3)

print(sys.getsizeof(my_list))    # ≈ 56 байт (включая место для расширения)
print(sys.getsizeof(my_tuple))   # ≈ 48 байт

# Скорость создания
import timeit

print(timeit.timeit("[1, 2, 3]", number=1000000))     # ≈ 0.08 сек
print(timeit.timeit("(1, 2, 3)", number=1000000))     # ≈ 0.03 сек

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

Только неизменяемые типы могут быть ключами:

# ✓ Кортеж как ключ
data = {
    (1, 2): "координаты",
    (3, 4): "ещё координаты"
}
print(data[(1, 2)])  # координаты

# ✗ Список как ключ
data = {
    [1, 2]: "координаты"  # TypeError: unhashable type: list
}

4. Операции распаковки и присваивания

Оба типа поддерживают распаковку, но синтаксис отличается:

# Список
x, y, z = [1, 2, 3]
print(x, y, z)  # 1 2 3

# Кортеж
a, b, c = (4, 5, 6)
print(a, b, c)  # 4 5 6

# Обычно кортежи не требуют скобок
a, b, c = 4, 5, 6
print(a, b, c)  # 4 5 6

# Множественное присваивание
first, *middle, last = (1, 2, 3, 4, 5)
print(first, middle, last)  # 1 [2, 3, 4] 5

5. Методы и операции

ОперацияListTuple
Доступ по индексу
Срезы
Итерация
Конкатенация
Повторение
.append()
.extend()
.pop()
.remove()
.sort()
.reverse()
.count()
.index()

6. Синтаксис создания

# Список
my_list = [1, 2, 3]          # С явными скобками
my_list = list([1, 2, 3])    # С конструктором
my_list = list(range(3))     # Из другого итерируемого

# Кортеж
my_tuple = (1, 2, 3)         # С явными скобками
my_tuple = 1, 2, 3           # Без скобок (автоматически кортеж)
my_tuple = tuple([1, 2, 3])  # Из другого итерируемого
single = (1,)                # Важно: одноэлементный кортеж требует запятую!
single_wrong = (1)           # Это просто число, не кортеж

7. Когда использовать что

Используй LIST когда:

  • Нужно изменять коллекцию (добавлять, удалять, изменять элементы)
  • Требуется наличие методов .append(), .sort(), etc.
  • Данные динамические и часто меняются
  • Размер заранее неизвестен

Используй TUPLE когда:

  • Данные должны быть неизменяемые (защита от случайных изменений)
  • Нужна хорошая производительность
  • Используется в качестве ключа словаря
  • Возвращаешь несколько значений из функции
  • Нужна защита от случайных модификаций

8. Примеры реального использования

# Возврат нескольких значений из функции
def get_coordinates():
    return (10, 20)  # Кортеж, не список

x, y = get_coordinates()

# Защита данных в функциях
def process_data(items: tuple[int, ...]) -> int:
    """Гарантируем, что items не будет изменена внутри функции"""
    return sum(items)

# Константные наборы данных
VALID_STATUSES = ("active", "inactive", "pending")  # Кортеж

if status in VALID_STATUSES:  # Проверка очень быстра для кортежей
    print("Valid")

# Ключи словаря для координат
memory_map = {
    (0, 0): "Origin",
    (1, 1): "Diagonal",
    (5, 10): "Point"
}

# Список для работы со сменяемыми данными
scores = [10, 20, 15]
scores.append(25)
scores.sort()
print(scores)  # [10, 15, 20, 25]

Заключение

Основное различие: список изменяем, кортеж нет. Выбор между ними зависит от того, будут ли данные изменяться. Кортежи быстрее, экономнее по памяти и могут быть ключами, а списки гибче и имеют больше методов для работы с данными.