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?
1,2,3, *[4,5,6]] File "<stdin>", line 1 [1,2,3, *[4,5,6]] ^ SyntaxError: invalid syntax[
Why doesn’t the
[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.
# 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
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.
* supposed to be used only to work with function params and not with lists, tuples etc.
NOTE: starting from python3.5,
* could be used not only with functions params, @B. M‘s answer greatly describes that change in python.
If you need to concat lists use concatenation instead
list1 + list2 to get desired result.
To concatenate list and generator simply pass
list type object, prior concatenating with another list:
gen = (x for x in range(10))  + list(gen)
This is not supported. Python 3 gives a better message (though Python 2 does not support
* in the left part of an assignment, afaik):
Python 3.4.3+ (default, Oct 14 2015, 16:03:50) [1,2,3, *[4,5,6]] File "<stdin>", line 1 SyntaxError: can use starred expression only as assignment target
f(*[4,5,6])is equivalent to
Function argument unfolding is a special case.