【備忘録】リストの注意 「参照渡し」と「複製」

python3
あくまで備忘録なんで雑に記録します

簡単に行列を作ろうとしたら失敗しました

n = int(input()) の時に n×n の行列
queue = [[0, 0, 0], [0, 0, 0],[0, 0, 0]] を作りたくて、

n = int(input())
mini_list = []
large_list = []
for i in range(n):
    mini_list.append(0)
for j in range(n):
    large_list.append(mini_list)
print(large_list)
#n = 3 で、[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

ところが、
large_list[1][1] = 1
と変換してみると

large_list[1][1] = 1
print(large_list)
#[[0, 1, 0], [0, 1, 0], [0, 1, 0]]

large_list.append(mini_list) の部分がまずいらしい

【Python】 リストを変数に代入する際に気をつけること(参照渡し、copyによるコピー)

mini_list(中のリスト)が複製されているのではなく、ただ”参照されている”だけらしい・・・

修正

n = int(input())
mini_list = []
large_list = []
for i in range(n):
    mini_list.append(0)
for j in range(n):
    large_list.append(mini_list.copy())
large_list[1][1] = 1
print(large_list)
#n=3 で [[0, 0, 0], [0, 1, 0], [0, 0, 0]]

もうちょっと簡潔に

【テンプレ】2次元初期化

n = int(input())
A = [[0] * n for _ in range(n)]
A[1][1] = 1
print(A)
#n=3 で  [[0, 0, 0], [0, 1, 0], [0, 0, 0]]

コメント

タイトルとURLをコピーしました