Sequence assignments normally require exactly as many names in the target on the left as there are items in the subject on the right.
We get an error if the lengths disagree in both 2.X and 3.X unless we manually sliced on the right:
seq = [1, 2, 3, 4] a, b, c, d = seq # from w w w .j a v a 2 s . c om print(a, b, c, d) #a, b = seq #ValueError: too many values to unpack (expected 2)
In Python 3.X, we can use a single starred name in the target to match more generally.
In the following code, variable a matches the first item in the sequence, and b matches the rest:
seq = [1, 2, 3, 4] a, *b = seq # w ww . jav a 2 s . c o m print( a ) print( b )
The starred name can appear anywhere in the target.
For instance, in the next interaction b matches the last item in the sequence, and a matches everything before the last:
seq = [1, 2, 3, 4] *a, b = seq # ww w.j av a 2 s . c om print( a ) print( b )
When the starred name appears in the middle, it collects everything between the other names listed.
In the following interaction a and c are assigned the first and last items, and b gets everything in between them:
seq = [1, 2, 3, 4] a, *b, c = seq # from w w w. j a va 2 s . co m print( a ) print( b ) print( c )
Wherever the starred name shows up, it will be assigned a list that collects every unassigned name at that position:
seq = [1, 2, 3, 4] a, b, *c = seq # w w w .j a v a 2 s. c o m print( a ) print( b ) print( c )
Like normal sequence assignment, extended sequence unpacking syntax works for any sequence types and any iterable, not just lists.
a, *b = 'test' print( a, b )# w w w .ja v a 2 s . c om a, *b, c = 'test' print( a, b, c ) a, *b, c = range(4) print( a, b, c )
We don't have to manually slice to get the first and rest of the items:
L = [1, 2, 3, 4] while L: # ww w .ja v a 2s.co m front, *L = L # Get first, rest without slicing print(front, L)