Чем список отличается от кортежа?
- В чём разница между list и tuple?
- Когда использовать кортеж вместо списка?
Список изменяемый, кортеж — нет; отсюда остальные различия.
- Кортеж может быть ключом словаря (если элементы хешируемы)
- Кортеж чуть легче по памяти и быстрее создаётся
А ещё Смысл: список — набор однотипных элементов, кортеж — запись с фиксированной структурой
Подробно
Оба — упорядоченные последовательности с доступом по индексу и срезами. Главное отличие — изменяемость.
Список (list) можно менять: append, insert, remove, sort, присваивание по индексу. Python выделяет ему память с запасом, чтобы append был быстрым.
Кортеж (tuple) после создания не меняется. Из этого следует:
- он хешируем, если хешируемы все элементы, — значит, годится в ключ
dictи вset; - занимает немного меньше памяти и создаётся быстрее; кортежи из констант компилятор может создать заранее;
- его безопасно отдавать наружу: никто не изменит его содержимое.
По смыслу: список — коллекция однородных элементов переменной длины («список пользователей»), кортеж — запись, где позиция имеет значение («координаты (x, y)», «строка из базы»). Для записей с именованными полями есть collections.namedtuple и typing.NamedTuple.
Кортеж из одного элемента пишется с запятой: (1,). Без неё (1) — просто число в скобках.
Пример
point = (10, 20)
x, y = point # распаковка
cache = {point: "клетка"} # кортеж как ключ
items = [3, 1, 2]
items.sort() # список меняется на месте
single = (1,) # кортеж из одного элемента
not_tuple = (1) # это int
from typing import NamedTuple
class User(NamedTuple):
id: int
name: strЧто хотят услышать
- Изменяемость как корень различий.
- Хешируемость кортежа и использование в ключах словаря.
- Различие по смыслу: однородная коллекция против записи.
- Знание
namedtupleи записи(1,).
Частые ошибки
- «Кортеж намного быстрее списка» — разница небольшая, выбирают по смыслу.
- Забыть запятую в кортеже из одного элемента.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Кортеж неизменяем и потому всегда хешируем, даже если внутри у него лежит изменяемый список
- ✗Кортеж изменяемый, список — нет
- ✗Список можно использовать как ключ словаря
- ✓Список изменяемый, кортеж — нет; кортеж из хешируемых элементов может быть ключом
Что спросят дальше
Разбор темы
- Типы и коллекции — что изменяемо, что хешируемо и как устроен dict
Изменяемые и неизменяемые типы, список и кортеж, словарь и множество на хеш-таблице, is против ==, модуль collections.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.