Search code examples
pythonpython-2.7iterable-unpackingargument-unpackingpep448

Python: Splat/unpack operator * in python cannot be used in an expression?


Does anybody know the reasoning as to why the unary (*) operator cannot be used in an expression involving iterators/lists/tuples?

Why is it only limited to function unpacking? or am I wrong in thinking that?

For example:

>>> [1,2,3, *[4,5,6]]
File "<stdin>", line 1
[1,2,3, *[4,5,6]]
        ^
SyntaxError: invalid syntax

Why doesn't the * operator:

[1, 2, 3, *[4, 5, 6]] give [1, 2, 3, 4, 5, 6]

whereas when the * operator is used with a function call it does expand:

f(*[4, 5, 6]) is equivalent to f(4, 5, 6)

There is a similarity between the + and the * when using lists but not when extending a list with another type.

For example:

# This works
gen = (x for x in range(10))

def hello(*args):
    print args    
hello(*gen)

# but this does not work
[] + gen
TypeError: can only concatenate list (not "generator") to list

Solution

  • Unpacking in list, dict, set, and tuple literals has been added in Python 3.5, as described in PEP 448:

    Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) on Windows (64 bits).
    
    >>> [1, 2, 3, *[4, 5, 6]]
    [1, 2, 3, 4, 5, 6]
    

    Here are some explanations for the rationale behind this change. Note that this does not make *[1, 2, 3] equivalent to 1, 2, 3 in all contexts. Python's syntax is not intended to work that way.