0.問題
1行目に行(n1)と列(n2)が、2行目以降にn2列の.または#がn1行入力されます。
2行目以降のn1行の文字列を2次元配列に格納してください。
1.入力データ
例として以下の入力データを与える
3 5
#####
.#.#.
# .#.#
2.コード例
# 作成する配列の行と列をスペース区切りで入力
in1 = input()
arr1=in1.split()
# 横に上記で指定したarr1[1]列分の文字列をarr1[0]行文読み込む
in2=[]
for i in range(int(arr1[0])):
tmp1=input()
in2.append(tmp1)
# 以下の二次元配列(arr1[0]行arr1[1]列)を作成
arr2=[[''] * int(arr1[1]) for i in range(int(arr1[0]))]
arr3=[['']*int(arr1[1])]*int(arr1[0])
# 上記で定義した2次元配列を表示
print(arr2)
print(arr3)
for i in range(int(arr1[0])):
tmp2=in2[i]
for j in range(int(arr1[1])):
arr2[i][j]=tmp2[j:j+1]
arr3[i][j]=tmp2[j:j+1]
print(arr2)
print(arr3)
3.出力結果
[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']]
[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']]
[['#', '#', '#', '#', '#'], ['.', '#', '.', '#', '.'], ['#', '.', '#', '.', '#']]
[['#', '.', '#', '.', '#'], ['#', '.', '#', '.', '#'], ['#', '.', '#', '.', '#']]
1行目と2行目は、初期化した2次元配列のデータが表示される。
注目するのは__3行目と4行目の実行結果の違い
__だ。
arr3の全ての配列の値が、入力最終行のデータに置き換わっているのだ。
4.検証
Pythonのリスト(配列)を任意の値・要素数で初期化を参考に
上記コードに下記コードを追加する。
print(arr2[0]==arr2[int(arr1[0])-1])
print(arr3[0]==arr3[int(arr1[0])-1])
False
True
arr3の要素のリストが全て同じオブジェクトとして扱われるため、
一つのリストが更新されると他のリストも同じ内容で更新されるという事らしい。
結論
2次元配列を初期値付きで宣言する場合は
リスト名=[[初期値] * 列数 for 任意の変数 in range(行数)]
を使う。