Распаковка значений в Python: короткая инструкция
За 15 минут разберётесь, как раскладывать кортежи, списки и словари по переменным без индексов, ловить «хвост» через звёздочку и менять значения местами одной строкой.

К концу инструкции вы будете писать first, second = pair вместо first = pair[0]; second = pair[1], забирать остаток списка через *rest и менять две переменные местами без временной. Всё это работает в Python 3.x, а звёздочка в распаковке — начиная с Python 3.0. Займёт минут пятнадцать, отдельных пакетов ставить не нужно.
Что нужно до начала
- Python 3.6 или новее. Проверьте командой
python --versionв терминале — должна вывестись строка вродеPython 3.11.5. - Любой редактор или встроенный интерактивный режим: наберите
python(илиpython3) без аргументов, появится приглашение>>>. - Никаких import — распаковка встроена в язык.
Все примеры ниже можно вставлять прямо в интерактивный режим по одной строке.
Шаг 1. Распакуйте кортеж в переменные
Если справа стоит кортеж или список, а слева — несколько имён через запятую, Python разложит значения по порядку.
point = (10, 20)
x, y = point
print(x) # 10
print(y) # 20
Проверка: print(x, y) должен вывести 10 20. Количество имён слева должно совпадать с количеством элементов справа, иначе будет ошибка — про неё в конце.
Шаг 2. Распакуйте список так же, как кортеж
Скобки справа не обязательны, а тип контейнера не важен: список раскладывается точно так же.
colors = ["red", "green", "blue"]
first, second, third = colors
print(second) # green
Проверка: print(third) выведет blue. Слева всё равно кортеж имён, даже без скобок — это одна и та же операция.
Шаг 3. Поменяйте две переменные местами
Классический приём, ради которого распаковку часто и вспоминают. Временная переменная не нужна.
a = 1
b = 2
a, b = b, a
print(a, b) # 2 1
Проверка: после строки a, b = b, a значения поменяются. Справа Python сначала собирает кортеж (b, a), то есть (2, 1), и только потом раскладывает его слева — поэтому старые значения не затираются.
Шаг 4. Заберите «хвост» через звёздочку
Когда элементов больше, чем нужных имён, поставьте перед одним именем звёздочку — в него уйдёт список из оставшихся значений.
numbers = [1, 2, 3, 4, 5]
head, *tail = numbers
print(head) # 1
print(tail) # [2, 3, 4] ← нет, тут будет [2, 3, 4, 5]
Проверка: tail получит [2, 3, 4, 5] — всё, кроме первого. Звёздочка всегда собирает в список, даже если справа был кортеж. Звёздочку можно ставить и в середине:
first, *middle, last = [1, 2, 3, 4, 5]
print(first) # 1
print(middle) # [2, 3, 4]
print(last) # 5
Проверка: middle выведет [2, 3, 4]. Звёздочку в одном присваивании можно использовать только один раз.
Шаг 5. Проигнорируйте ненужное через подчёркивание
Если значение не нужно, по соглашению его кладут в переменную _. Технически это обычное имя, просто читатели кода понимают: значение выбрасывается.
record = ("Мария", 34, "Москва")
name, _, city = record
print(name, city) # Мария Москва
Проверка: print(name, city) выведет Мария Москва, а возраст останется в _ и им никто не пользуется.
Шаг 6. Распакуйте элементы прямо в цикле
Частая ситуация: список пар и функция enumerate или zip. Распаковка избавляет от индексов внутри тела цикла.
pairs = [("Аня", 25), ("Борис", 30), ("Вера", 28)]
for person, age in pairs:
print(f"{person}: {age}")
# С нумерацией через enumerate
for index, color in enumerate(["red", "green", "blue"]):
print(index, color)
Проверка: первый цикл выведет три строки вида Аня: 25, второй — пары 0 red, 1 green, 2 blue.
Шаг 7. Разберите словарь на ключи и значения
Чтобы распаковать пары ключ-значение, идите по items().
prices = {"хлеб": 40, "молоко": 80}
for product, price in prices.items():
print(product, price)
Проверка: выведутся строки хлеб 40 и молоко 80. Если написать for product, price in prices: без .items(), будет ошибка — по словарю итерация идёт только по ключам.
Правило простое: сколько имён слева — столько значений справа. Всё остальное — либо звёздочка, которая собирает остаток, либо ошибка, которую видно сразу при запуске.
Если не получилось
Четыре сообщения, которые вы реально увидите, и что с ними делать.
ValueError: too many values to unpack (expected 2)— справа больше элементов, чем имён слева. Либо добавьте имя, либо соберите остаток через*.ValueError: not enough values to unpack (expected 3, got 2)— справа меньше элементов, чем ожидалось. Проверьте, что контейнер действительно нужной длины.TypeError: cannot unpack non-iterable int object— пытаетесь распаковать одно число или другое неитерируемое значение:a, b = 5. Слева несколько имён — справа должен быть контейнер.SyntaxError: two starred expressions in assignment— две звёздочки в одном присваивании. Оставьте одну.
Шпаргалка по формам записи
| Запись | Что делает | Результат для входа |
|---|---|---|
a, b = x | ровно два значения | (1, 2) → a=1, b=2 |
a, *b = x | первое + остаток списком | [1,2,3] → a=1, b=[2,3] |
*a, b = x | остаток списком + последнее | [1,2,3] → a=[1,2], b=3 |
a, _, c = x | среднее игнорируется | (1,2,3) → a=1, c=3 |
a, b = b, a | обмен значениями | a↔b |
Что дальше
Освоив базу, посмотрите на две соседние темы. Первая — распаковка при вызове функций: func(*args) и func(**kwargs) разворачивают список и словарь в аргументы, это та же звёздочка, но в другом контексте. Вторая — match-выражения из Python 3.10, где распаковка встроена в сопоставление с образцом. Начните с того, что перепишете ближайший цикл с индексами row[0], row[1] на распаковку в заголовке for — это самый частый способ сделать код читаемее без единой новой строки.
Антиблок-аналитик 115-ФЗ: Анализ выписок, поиск рисков блокировки счёта, инструкции по безопасным транзакциям.
Спросить за 41 ₽Источники: Python docs — Assignment statements (unpacking), PEP 3132 — Extended Iterable Unpacking
Частые вопросы
А если у меня Python 2 или очень старая версия 3?
Почему a, b = 5 выдаёт ошибку, а a, b = 5, 6 работает?
Обязательно ли использовать именно _ для ненужных значений?
Можно ли поставить две звёздочки в одном присваивании?
Что происходит с производительностью при распаковке больших списков?
Как распаковать значение только если оно есть, не зная длину заранее?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.