前提・実現したいこと
下記コードの意味が分かりません。
おわかりの方ご教示ください。
発生している問題・エラーメッセージ
*a,=map(int,input().split())
input().split()は、inputに「1 2 3 4」みたいな文字列が入ってくる想定なので、
この部分はリストになるんじゃないかと思っています。
そのリストの各要素をint関数の処理にかけて左辺に代入しそうに見えますが、
左辺の*a,というのがわかりません。
補足情報(FW/ツールのバージョンなど)
python3.8.2のコードです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
まず、基礎知識として、タプルを理解していますか。
python
1>>> x = 1, 2 2>>> print(x) 3(1, 2)
が理解できているなら良いのですが理解できない場合は、公式ドキュメント チュートリアル 5.3. タプルとシーケンスを呼んで理解してください。
これがわかっていれば、以下の四つは同じ意味だということは理解できるはずです。
python
1x, y = 1, 2 2(x, y) = (1, 2) 3x, y = (1, 2) 4(x, y) = 1, 2 5
実行結果は以下のようになります。
python
1>>> x = 1, 2 2>>> print(x) 3(1, 2) 4>>> x, y = 1, 2 5>>> print('x =', x) 6x = 1 7>>> print('y =', y) 8y = 2
代入については、、公式ドキュメント 7.2. 代入文 (assignment statement)に以下のように書かれています。(番号は私が追加しました)
document
11 ターゲットリストのターゲットが1つだけでコンマが続いておらず、任意に丸括弧で 2 囲われている場合、オブジェクトはそのターゲットに代入されます。 3 42 そうでない場合: オブジェクトは、ターゲットリストのターゲットと同じ数の要素を 5 持つイテラブルでなければならず、要素は左から右へ対応するターゲットに代入されます。 6 7 2.1 "星付き"のターゲットと呼ばれる、頭にアスタリスクが一つ付いたターゲットが 8 ターゲットリストに一つだけ含まれている場合: オブジェクトはイテラブルで、 9 少なくともターゲットリストのターゲットの数よりも一つ少ない要素を持たなければ 10 なりません。 星付きのターゲットより前のターゲットに、イテラブルの先頭の要素が 11 左から右へ代入されます。 星付きのターゲットより後ろのターゲットに、イテラブル 12 の末尾の要素が代入されます。 星付きのターゲットに、イテラブルの残った要素の 13 リストが代入されます (リストは空でもかまいません)。 14 15 2.2 そうでない場合: オブジェクトは、ターゲットリストのターゲットと同じ数の要素を 16 持つイテラブルでなければならず、要素は左から右へ対応するターゲットに代入されます。
例を挙げると以下のようになります。
python
1>>> x, *y = range(5) 2>>> print('x =', x) 3x = 0 4>>> print('y =', y) 5y = [1, 2, 3, 4]
今回の処理は、2.1です。ターゲット(左辺)がタプルであるため、オブジェクト(右辺)はイテラブルでなければなりませんが、map(int,input().split())はイテラブルなので条件を満たしています。
「*a,」には、星付きのターゲットより前のターゲットが存在せず、星付きのターゲットより後ろのターゲットも存在しません。そのため、map(int,input().split())の全ての要素が星付きのターゲットに代入されます。
投稿2021/10/17 05:34
編集2021/10/17 06:20総合スコア24670
0
ベストアンサー
いわゆる「アンパック(展開)代入」という挙動になります。
左辺での*
がついた変数に、右辺の結果が「アンパック」されて格納されます。
注意しなければならないのは、代入される左辺はリストまたはタプルである必要があることです。
すなわち*a = map(~
という書き方だとエラーになります。
詳細は
Pythonでタプルやリストをアンパック(複数の変数に展開して代入)のアスタリスク*を使ったアンパック
や
Unpacking in Python: Beyond Parallel AssignmentのPacking With the * Operator
を参照ください。
Python
1#*a = map(int,'123') # SyntaxError: starred assignment target must be in a list or tuple 2 3*a,b = map(int,'123') 4print(a, b) # [1, 2] 3 5 6*a, = map(int,'123') 7print(a) # [1, 2, 3]
投稿2021/10/17 03:44
総合スコア38341
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Python の代入文は多彩です。
複数変数 = iterable object
とすると iterable object をアンパックして複数の変数に代入します。
この時、iterable object の要素と変数の数は同じである必要があります。
つまり
a, b, c = map(int,input().split())
とした場合は 1 2 3 と入力すればアンパックできます。
ここで
a, *b = map(int,input().split())
とすると最初の1つ以外の入力値を変数 b にリストオブジェクトとして受け取れます。
1 2 3 と入力すれば a に 1 が b に [2, 3] のリストオブジェクトが代入されます。
*付きの変数は1つだけ指定できます。
すべてをリストとして受け取りたい場合は
*a, = map(int,input().split())
と書くことができますが
a = list(map(int,input().split()))
の方が分かりやすいでしょうね。
投稿2021/10/17 03:35
総合スコア1156
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。