@matsushita_knz

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonの二次元配列

Q&A

Closed

解決したいこと

Pythonの二次元配列

内容

以下ソースコードで、最初に行と列の数を指定し、多次元配列の初期化を行った後、index,添え字で指定した場所の要素を変えたいのですが、なぜか最後に入力した値が全ての行の要素になってしまいます。

print印字で色々考えたり試しましたが、分かりません。

該当するソースコード

#半角スペース区切りで、行数と列数を入力
x = input()

s,m = x.split(' ')

s = int(s)
m = int(m)

#              row  col
list01 = [[0] * m] * s

print(list01)

tmp_list = []

for i in range(m):
    print(i,'行目:',end='')

    tmp = input()
    tmp_list = tmp.split(' ')

    for n in range(len(tmp_list)):

        print(f'list01[{i}][{n}] <- tmp_list[{tmp_list[n]}]')
        
        list01[i][n] = tmp_list[n]

        print(f'list01[{i}][{n}] = {list01[i][n]}')

for i in list01:
    print(i)

実行例)

2 2
[[0, 0], [0, 0]]
0 行目:1 2
list01[0][0] <- tmp_list[1]
list01[0][0] = 1
list01[0][1] <- tmp_list[2]
list01[0][1] = 2
1 行目:3 4
list01[1][0] <- tmp_list[3]
list01[1][0] = 3
list01[1][1] <- tmp_list[4]
list01[1][1] = 4
['3', '4']
['3', '4']

やりたいこと

上記の実行例で、
[
[0,0],
[0,0]
]

を書き換え、

最後の
['3','4']
['3','4']
となっているところを
['1','2']
['3','4']
にしたい。

0 likes

1Answer

リストlist01の作成方法が間違っています。
[[0] * m] * sはリスト内の各行が同じオブジェクトを参照してしまいます。
なのでlist01[i][n] = tmp_list[n]ですべての行に同じ値が代入されているはずです。デバッガーなどで確認してみてください。

正しい方法は、以下のように、各行を別々のオブジェクトとして初期化します。

list01 = [[0] * m for _ in range(s)]
0Like

Comments

  1. @matsushita_knz

    Questioner

    解決しました!
    ありがとうございます。

Your answer might help someone💌