「アンパックってなに?」
「a = *'abc'ってなに?」
「*a = 'abc'って、アスタリスクを付けるのが前後逆になると出力が違うの???」
となったので、
アスタリスクの意味の1つであるパック、アンパックについて解説する。
>>>a,b,c,d,e,f,g = (*"apple","banana","tomato")
>>>
>>>
Output:a, p, p, l, e, banana, tomato
アンパックを一文で表すと、「複数の要素を持つものを分解して各変数に代入すること」である。
(また、展開とも言われている。(引数に入るアンパック(zip(* list))など))
「Q. (x+2)(x+5)
A. x2+7x+10 」:展開
どういうことかというと、
a,b,c,d,e,f,g = (*"apple","banana","tomato")
と書いたら、アスタリスクが付いている"apple"が1つずつに分解される。
そして、
a = "a"
b = "p"
c = "p"
d = "l"
e = "e"
f = "banana"
g = "tomato"
一番最初(a,b,c,...)の変数から順番に、1つずつ分解された値が入っていく。
"banana"と"tomato"はアスタリスクが付いてないし特に指定もないため、余ったfとgにそのまま入って、ピッタリと全ての値が変数に収まる。
ちなみに、fとgを無くして、ピッタリと値が収まらないようにすると、
>>>a,b,c,d,e = (*"apple","banana","tomato")
>>>
>>>
ValueError: too many values to unpack
このように、Errorが出る。変数の数を出力される値の数にきっちりと合わせないといけないらしい。
>>>*a,b = ("apple","banana","tomato")
>>>
>>>
Output:['apple', 'banana'] tomato
次に、パックとは何かを説明する。
要は、アンパックの逆である。値を括弧でまとめて変数に代入する。
*a,b = ("apple","banana","tomato")
と書いたら、アスタリスクが付いているaが、変数の数と値の数が合うように値を上手くまとめる。
そして、
a = ['apple', 'banana']
b = "tomato"
aには'apple'と'banana'が入って、bにもきちんと値が入るように、残った'banana'が入る。
ちなみに、
>>>*a,b,c,d = ("apple","banana","tomato")
>>>
>>>
Output:[] apple banana tomato
変数にcとdを増やした結果、パックを指定していないb、c、dに値が入って、パックを指定したaには何も値が入らなかった。
代入の優先順位は、パックを指定していない普通の変数の方が上らしい。