How does it work under the hood? I don't understand the reason for the errors below:
>>> def f():
... yield 1,2
... yield 3,4
...
>>> *f()
File "<stdin>", line 1
*f()
^
SyntaxError: invalid syntax
>>> zip(*f())
[(1, 3), (2, 4)]
>>> zip(f())
[((1, 2),), ((3, 4),)]
>>> *args = *f()
File "<stdin>", line 1
*args = *f()
^
SyntaxError: invalid syntax
The two errors are showing the same thing: you can't use
*
on the left-hand side of an expression.I'm not sure what you're expecting to happen in those cases, but it's not valid.
Running this in Python 3 gives a more descriptive error message.
The
*iterable
syntax is only supported in an argument list of a function call (and in function definitions).In Python 3.x, you can also use it on the left-hand side of an assignment, like this:
Edit: Note that there are plans to support the remaining generalisations.