Распаковка в Python: присваивание, * и ** на практике
Поисковый запрос «распаковка в Python» часто возникает у новичков, когда они видят код вроде a, b = b, a, first, *middle, last = items или func(**data). На первый взгляд это выглядит магически, но на практике распаковка — один из самых удобных базовых инструментов Python.
Распаковка позволяет взять элементы из последовательности или словаря и разложить их по переменным. Она делает код короче, уменьшает количество индексов и помогает избежать лишних временных переменных.
Простая распаковка списков и кортежей
Самый простой пример — присвоить элементы списка нескольким переменным:
point = [10, 20]
x, y = point
print(x) # 10
print(y) # 20
То же самое работает с кортежами:
user = ('Анна', 25, 'Python')
name, age, language = user
print(name) # Анна
print(age) # 25
print(language) # Python
Важное правило: количество переменных слева должно совпадать с количеством элементов справа. Иначе Python выдаст ошибку.
values = [1, 2, 3]
# Ошибка: переменных 2, а значений 3
a, b = values
Обмен значений без временной переменной
Классический практический пример распаковки — поменять две переменные местами:
a = 5
b = 10
a, b = b, a
print(a) # 10
print(b) # 5
В других языках часто используют временную переменную, но в Python это делается одной строкой и читается очень естественно.
Распаковка с помощью звёздочки *
Если элементов может быть больше, чем переменных, используйте *. Такая переменная соберёт «лишние» элементы в список.
numbers = [1, 2, 3, 4, 5]
first, *rest = numbers
print(first) # 1
print(rest) # [2, 3, 4, 5]
Можно забрать первый и последний элемент, а середину собрать отдельно:
items = ['start', 'a', 'b', 'c', 'finish']
first, *middle, last = items
print(first) # start
print(middle) # ['a', 'b', 'c']
print(last) # finish
Это удобно при обработке строк, таблиц, логов, CSV-данных и любых списков, где важны крайние элементы.
Игнорирование ненужных значений
Если какое-то значение не нужно, часто используют переменную _. Это соглашение: оно показывает читателю, что значение намеренно игнорируется.
user = ('Иван', 'ivan@example.com', 32)
name, _, age = user
print(name) # Иван
print(age) # 32
Если нужно отбросить несколько значений, можно сочетать _ со звёздочкой:
data = ['header', 'row1', 'row2', 'row3', 'footer']
header, *_, footer = data
print(header) # header
print(footer) # footer
Распаковка в циклах
Очень часто распаковка встречается в циклах. Например, при переборе списка кортежей:
users = [
('Анна', 25),
('Борис', 31),
('Ольга', 28),
]
for name, age in users:
print(f'{name}: {age}')
Такой код проще, чем обращаться к элементам по индексам user[0] и user[1].
Ещё один частый пример — перебор словаря. Метод items() возвращает пары «ключ-значение», которые удобно распаковывать прямо в цикле:
prices = {
'apple': 80,
'banana': 120,
'orange': 100,
}
for product, price in prices.items():
print(f'{product}: {price} руб.')
Оператор * при создании списков
Звёздочка умеет не только собирать значения, но и распаковывать список внутрь другого списка:
first = [1, 2]
second = [3, 4]
result = [0, *first, *second, 5]
print(result) # [0, 1, 2, 3, 4, 5]
Это удобная альтернатива сложению списков, особенно когда нужно вставить элементы в середину.
Оператор ** для словарей
Две звёздочки ** используются для распаковки словарей. Например, можно объединить настройки:
default_settings = {
'theme': 'light',
'language': 'ru',
'notifications': True,
}
user_settings = {
'theme': 'dark',
}
settings = {**default_settings, **user_settings}
print(settings)
# {'theme': 'dark', 'language': 'ru', 'notifications': True}
Если ключи совпадают, значение из словаря, который расположен правее, перезапишет предыдущее. В примере theme стал равен dark.
Передача аргументов в функцию через * и **
Оператор * можно использовать, чтобы передать список или кортеж как позиционные аргументы:
def create_user(name, age, city):
return f'{name}, {age}, {city}'
data = ['Мария', 27, 'Казань']
print(create_user(*data))
# Мария, 27, Казань
А ** передаёт словарь как именованные аргументы:
def create_user(name, age, city):
return f'{name}, {age}, {city}'
data = {
'name': 'Мария',
'age': 27,
'city': 'Казань',
}
print(create_user(**data))
# Мария, 27, Казань
Важно: ключи словаря должны совпадать с именами параметров функции. Если в словаре будет лишний ключ, Python выдаст ошибку.
Частые ошибки при распаковке
- Несовпадение количества значений. Если переменных больше или меньше, чем элементов, используйте * или проверьте структуру данных.
- Неподходящие ключи при **. Имена ключей словаря должны совпадать с параметрами функции.
- Слишком сложная распаковка. Если строка становится нечитаемой, лучше разбить её на несколько шагов.
- Злоупотребление _. Игнорировать значения удобно, но если их много, возможно, стоит пересмотреть структуру данных.
Практические рекомендации
Используйте распаковку там, где она улучшает читаемость: в циклах, при работе с парами значений, для обмена переменных, при объединении списков и словарей. Но не превращайте одну строку в головоломку. Хороший Python-код должен читаться почти как обычный текст.
Если вы хотите не просто запомнить отдельные приёмы, а выстроить прочную базу Python от синтаксиса до практических проектов, посмотрите курс «Python с нуля до уверенного уровня: практика, задачи и реальные примеры». Он хорошо дополняет такие темы, как распаковка, функции, коллекции и работа с данными.
Краткий итог
Распаковка в Python — это способ удобно разложить элементы коллекции по переменным. Одинарная звёздочка * работает с последовательностями, двойная ** — со словарями. Эти инструменты особенно полезны в циклах, при передаче аргументов в функции и при сборке новых списков или словарей.
-
Создано 09.11.2026 17:00:40
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.