« [Visual Basic]正規表現を使って文字列を分割する | トップページ | [R]要素にNAかNaNが含まれていないか簡単に確認する »

2020年7月 2日 (木)

[Python]2次元配列(リストのリスト)の要素の値が勝手に変わる

2次元配列(リストのリスト)を作るときに、乗算演算子を繰り返し使用して作成するとうまくいかない。以下は、この方法で2行3列の2次元配列を新規に作成して、1行目の2列目に100を代入した例。

>>> x = [[0] * 3] * 2
>>> x
[[0, 0, 0], [0, 0, 0]]
>>> x[0][1] = 100
>>> x
[[0, 100, 0], [0, 100, 0]]

1列目の2列目の要素だけを100にしたはずだが、2行目の2列目の要素も100になっている。

id関数で、1行目と2行目の識別番号を確認する(表示される識別番号は環境などにより異なる)。

>>> id(x[0])
1854005696968
>>> id(x[1])
1854005696968
>>> id(x[0]) == id(x[1])
True

識別番号が同一のため、同じオブジェクトであることがわかる。つまり、この場合は、行同士は互いに参照でしかないことがわかる。

そのため、2次元配列(リストのリスト)を作るときは、乗算演算子を繰り返して使用してはいけない。最初に1次元目を作成して、そのあとに1次元目ごとに2次元目を作成する。

>>> x = [None] * 2
>>> for i in range(2):
... x[i] = [None] * 3
...
>>> x
[[None, None, None], [None, None, None]]
>>> x[0][1] = 100
>>> x
[[None, 100, None], [None, None, None]]

最後に1行目の2列目に100を代入したが、1行目2列目の値だけが変わっており、他の要素はそのままであることが分かる。

リスト内包表記を使うと1行で作成することができる。

>>> x = [[None] * 3 for i in range(2)]
>>> x
[[None, None, None], [None, None, None]]
>>> x[0][1] = 100
>>> x
[[None, 100, None], [None, None, None]]

« [Visual Basic]正規表現を使って文字列を分割する | トップページ | [R]要素にNAかNaNが含まれていないか簡単に確認する »

Python」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« [Visual Basic]正規表現を使って文字列を分割する | トップページ | [R]要素にNAかNaNが含まれていないか簡単に確認する »

無料ブログはココログ

■■

■■■