[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」カテゴリの記事
- [Python]コマンドラインでバージョンを確認する(2025.02.06)
- [Python]文字列のハッシュ値を得る(2025.02.03)
- [Python]等差数列を作成する(2023.06.05)
- [Python]連立一次方程式を解く(2023.04.26)
- [Python]ファイルのハッシュ値を得る(2023.04.15)
« [Visual Basic]正規表現を使って文字列を分割する | トップページ | [R]要素にNAかNaNが含まれていないか簡単に確認する »

コメント