質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

790閲覧

変数への値の代入の際に、*変数, = と書くとどうなるか

konishi201102

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/10/17 03:01

前提・実現したいこと

下記コードの意味が分かりません。
おわかりの方ご教示ください。

発生している問題・エラーメッセージ

*a,=map(int,input().split())

input().split()は、inputに「1 2 3 4」みたいな文字列が入ってくる想定なので、
この部分はリストになるんじゃないかと思っています。
そのリストの各要素をint関数の処理にかけて左辺に代入しそうに見えますが、
左辺の*a,というのがわかりません。

補足情報(FW/ツールのバージョンなど)

python3.8.2のコードです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

いわゆる「アンパック(展開)代入」という挙動になります。
左辺での*がついた変数に、右辺の結果が「アンパック」されて格納されます。
注意しなければならないのは、代入される左辺はリストまたはタプルである必要があることです。
すなわち*a = map(~という書き方だとエラーになります。

詳細は
Pythonでタプルやリストをアンパック(複数の変数に展開して代入)アスタリスク*を使ったアンパック
Unpacking in Python: Beyond Parallel AssignmentPacking 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

can110

総合スコア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

lehshell

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問