24

I was researching about python codegolf and saw someone use the unpacking operator in a strange way:

*s,='abcde'

I know that the unpacking operator basically iterates over a sequence. So I know that

s=[*'abcde']

will "unpack" the abcde string and save ['a', 'b', 'c', 'd', 'e'] in variable s.

Can someone explain as thoroughly as possible how does the

*s,='abcde'

statement work? I know it does the same thing as s=[*'abcde'] but it accomplishes it in a different way. Why is the unpacking iterator on the variable, instead of the string? Why is there a comma right after the variable name?

Fabián Montero
  • 1,613
  • 1
  • 16
  • 34
  • 4
    I'm conflicted on whether this is a duplicate of [Star * operator on left vs right side of an assignment statement](https://stackoverflow.com/questions/35636785/star-operator-on-left-vs-right-side-of-an-assignment-statement). The answer should help there in any case. – miradulo Jun 20 '18 at 14:35
  • 1
    @miradulo I read the question and its answers and some things have cleared up. Nevertheless, I am still confused about the use of the comma after the variable name. Does that have to do with the fact that s will become a list? – Fabián Montero Jun 20 '18 at 14:41
  • 2
    @machetazo in order to use the `*` on the lhs - the lhs needs to be a comma separate list or `[ ]`. A trailing comma creates a comma separate list of just one item and would be equivalent to `[*s]='abcde'` but this is one character more. – AChampion Jun 20 '18 at 14:43

2 Answers2

33

This is Iterable Unpacking. You may have seen it in other places to assign values to multiple variables from a single expression

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

This syntax includes a * to indicate that this variable should be a list containing the elements from the iterable that weren't explicitly assigned to another variable.

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

So, what's going on in your example? There's only a single variable name being assigned to, so it's going to take all the items not assigned to another variable, which in this case is all of them. If you try just

*s='abcde'

you'll get

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

Which is why that comma is there, as a trailing comma is how you indicate a single-value tuple.

Patrick Haugh
  • 59,226
  • 13
  • 88
  • 96
  • 4
    [PEP 3132](https://www.python.org/dev/peps/pep-3132/#specification) does: "A tuple (or list) on the left side of a simple assignment..." – Patrick Haugh Jun 20 '18 at 14:49
3

The trailing comma is required only to create a single tuple (a.k.a. a singleton); it is optional in all other cases. A single expression without a trailing comma doesn’t create a tuple, but rather yields the value of that expression.

Mickey
  • 31
  • 2