В чём разница между списком (list) и кортежем (tuple) в Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между списком и кортежем в 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. Методы и операции
| Операция | List | Tuple |
|---|---|---|
| Доступ по индексу | ✓ | ✓ |
| Срезы | ✓ | ✓ |
| Итерация | ✓ | ✓ |
| Конкатенация | ✓ | ✓ |
| Повторение | ✓ | ✓ |
.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]
Заключение
Основное различие: список изменяем, кортеж нет. Выбор между ними зависит от того, будут ли данные изменяться. Кортежи быстрее, экономнее по памяти и могут быть ключами, а списки гибче и имеют больше методов для работы с данными.