Оператор распаковки Python (*)

Я изучал Python codegolf и видел, как кто-то странным образом использовал оператор распаковки:

*s,='abcde'

Я знаю, что оператор распаковки в основном выполняет итерацию по последовательности. Так что я знаю что

s=[*'abcde']

«распакует» строку abcde и сохранит ['a', 'b', 'c', 'd', 'e'] в переменной s.

Может ли кто-нибудь максимально подробно объяснить, как

*s,='abcde'

постановочная работа? Я знаю, что он делает то же самое, что и s=[*'abcde'], но делает это по-другому. Почему итератор распаковки находится в переменной, а не в строке? Почему сразу после имени переменной стоит запятая?

Я не согласен с тем, является ли это дубликатом Оператор звездочка * слева и справа от оператора присваивания. Ответ там в любом случае должен помочь.

miradulo 20.06.2018 16:35

@miradulo Я прочитал вопрос и ответы на него, и кое-что прояснилось. Тем не менее, меня все еще смущает использование запятой после имени переменной. Связано ли это с тем, что s станет списком?

machetazo 20.06.2018 16:41

@machetazo, чтобы использовать * на левой стороне - левая сторона должна быть списком, разделенным запятыми, или [ ]. Завершающая запятая создает отдельный список, состоящий только из одного элемента, и будет эквивалентен [*s]='abcde', но это на один символ больше.

AChampion 20.06.2018 16:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
15
3
5 352
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это Итерационная распаковка. Возможно, вы видели это в других местах, чтобы присвоить значения нескольким переменным из одного выражения.

a, b, c = [1, 2, 3]

Этот синтаксис включает *, чтобы указать, что эта переменная должна быть списком, содержащим элементы из итерируемого объекта, которые не были явно назначены другой переменной.

a, *b, c = [1, 2, 3, 4, 5]
print(b)
# [2, 3, 4]

Итак, что происходит в вашем примере? Присваивается только одно имя переменной, поэтому она будет принимать все элементы, не назначенные другой переменной, а в данном случае все они. Если вы попробуете просто

*s='abcde'

ты получишь

SyntaxError: starred assignment target must be in a list or tuple

Вот почему здесь присутствует эта запятая, поскольку конечная запятая указывает на однозначный кортеж.

PEP 3132 выполняет: «Кортеж (или список) в левой части простого присваивания ...»
Patrick Haugh 20.06.2018 16:49

Завершающая запятая требуется только для создания одного кортежа (также известного как одноэлементный); во всех остальных случаях это необязательно. Одиночное выражение без запятой не создает кортеж, а возвращает значение этого выражения.

Другие вопросы по теме