Pythonの代入文は、以下のように書けます。
a, b = 1, 2
また、以下のように書くことにより、可変長引数を持つ関数が書けます。
def func(*args):
print(repr(args))
func(1)
# 出力: (1,)
func(1, 2)
# 出力: (1, 2)
まぁ、一応自分もPythonを始めてほどほど経つので、これくらいの事は当然知っているわけですが、ふと、代入文も「*
」(アスタリスク)を使えないのだろうか、と疑問に思った次第です。
a, *b = 1, 2, 3
print((a, b))
# 出力: (1, [2, 3])
できるじゃん!
念のため、仕様がどのようになっているか、確認してみると、
"星付き"のターゲットと呼ばれる、頭にアスタリスクが一つ付いたターゲットがターゲットリストに一つだけ含まれている場合: オブジェクトはイテラブルで、少なくともターゲットリストのターゲットの数よりも一つ少ない要素を持たなければはなりません。 星付きのターゲットより前のターゲットに、イテラブルの先頭の要素が左から右へ代入されます。 星付きのターゲットより後ろのターゲットに、イテラブルの末尾の要素が代入されます。 星付きのターゲットに、イテラブルの残った要素のリストが代入されます (リスト空でもかまいません)。
しっかり書かれていますね。
いろいろとやってみましょう。
a, *b = 1,
print((a, b))
# 出力: (1, [])
a, *b, c = 1, 2, 3, 4, 5
print((a, b, c))
# 出力: (1, [2, 3, 4], 5)
*a, = 1, 2, 3
print(a)
# 出力: [1, 2, 3]
ですが、以下のようなものはダメです。
a, b, *c = 1,
# ValueError: not enough values to unpack (expected at least 2, got 1)
# cは空でもいいが、a,bに代入すべき値は必ず指定しなければならない。
*a = 1, 2, 3
# SyntaxError: starred assignment target must be in a list or tuple
# 「*」のつくターゲットは、リスト・タプルの中になければならない。
今までは左辺だけでしたが、右辺にも使えるようです。
d = 10, 20
a, b, c = 1, *d
print((a, b, c))
# 出力: (1, 10, 20)
# 「a, b, c = 1, d[0], d[1]」と同様。