paizaを触って1か月、レート2000に到達しました。
実装言語にはPythonを使っていたのですがこの機会にいくつか備忘録を残します。
使用言語:Python 3.11.2
結論
多次元リストの初期化にはリスト内包表記を活用する
[[0]*3 for _ in range(4)]
Python Documentation contents にて同内容の説明が掲載されている
https://docs.python.org/ja/3/faq/programming.html#how-do-i-create-a-multidimensional-list
※ コメントにてご教示いただきました。ありがとうございます。
また明確な意図がない限り下記表現は使わない
[[0]*3] * 4
サンプル(OKパターン)
4×3サイズの0埋めリストを初期化する場合
test.py
# 二次元リストnizi_listの初期化
ROWS,COLUMNS=4,3
nizi_list = [[0]*ROWS for _ in range(COLUMNS)]
print("■nizi_listの初期化後の中身");print(*nizi_list, sep='\n');print()
# 各リストのオブジェクトIDの確認
print("■nizi_listの各リストのオブジェクトIDの確認")
for i in range(COLUMNS):
print("nizi_list[%d]のオブジェクトID: %d"%(i,id(nizi_list[i])))
print()
# 二次元リストnizi_listの要素の変更
nizi_list[0][1] = 1
print("■nizi_list[0][1]の値変更後の中身");print(*nizi_list, sep='\n');print()
実行結果
■nizi_listの初期化後の中身
[0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]
■nizi_listの各リストのオブジェクトIDの確認
nizi_list[0]のオブジェクトID: 1936982372288
nizi_list[1]のオブジェクトID: 1936982416256
nizi_list[2]のオブジェクトID: 1936982411712
■nizi_list[0][1]の値変更後の中身
[0, 1, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]
サンプル(NGパターン)
4×3サイズの0埋めリストを初期化する場合
test.py
#二次元リストnizi_listの初期化
ROWS,COLUMNS=4,3
nizi_list = [[0]*ROWS] * COLUMNS
print("■nizi_listの初期化後の中身");print(*nizi_list, sep='\n');print()
#(以下略)
test.py実行結果のログ
■nizi_listの初期化後の中身
[0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]
■nizi_listの各リストのオブジェクトIDの確認
nizi_list[0]のオブジェクトID: 2893548518592
nizi_list[1]のオブジェクトID: 2893548518592
nizi_list[2]のオブジェクトID: 2893548518592
■nizi_list[0][1]の値変更後の中身
[0, 1, 0, 0]
[0, 1, 0, 0]
[0, 1, 0, 0]
-
nizi_list[0][1]
のみ代入したつもりがnizi_list[1][1]
とnizi_list[2][1]
にも反映された- これは
nizi_list[0]
~nizi_list[2]
が全て同オブジェクトとして定義されたため - オブジェクトIDはid関数を用いることで参照可能
- これは