Skip to content

Q&A:リストの変数割り当てについて

Koki Saitoh edited this page Sep 28, 2018 · 4 revisions

質問

本書籍P.33に、次のようなコードがあります。

class MatMul:
    def __init__(self, W):
        self.params = [W]
        .... 

    def forward(self, x):
        W, = self.params
        out = np.dot(x, W)
        ....      

これはMatMulクラスの実装ですが、なぜW, = ...というように、Wの後にコンマをつける必要があるのですか?

回答

これは、Pythonでリストの要素を取り出す記法に関係した問題です。

前提としまして、Pythonではリストの要素を変数に割り当てるのに、次のように書くことができます。

>>> list = [0, 1, 2]
>>> a, b, c = list
>>> print(a)
0

ここでは、リストの要素が3つあるため、a, b, c = ...のように書くことで、リストの要素がそれぞれの変数に割り当てられます。もちろん、ここで次のように書くと、変数aにはリスト自体が代入されます。

>>> a = list
>>> print(a)
[0, 1, 2]

以上のことは、リストの要素が1つの場合も成り立ちます。ただし、要素が1つの場合は、コンマをつけることで、リストに存在するただ1つの要素を取り出していることを表します。例を挙げると次のようになります。

>>> list = [0]
>>> a, = list
>>> print(a)
0

>>> a = list
>>> print(a)
[0]

これで、今回の質問も解決したと思います。

上の質問のコードでW, = self.paramsとしたのは、self.paramsのリストには要素が1つしかないため、その要素をWという変数に割り当てるためには、Wの後にコンマを付ける必要があるのです。

まとめ

  • リストから要素を取り出すときは、リストの要素分だけ変数を用意して、それをコンマで区切り、イコールで代入できる (例:a, b, c = list

  • リストの要素が1つの場合は、変数の後にコンマをつけることで、そのリストの要素を取り出すことができる (例:a, = list

Clone this wiki locally