質問
Pythonを使って競プロを勉強しているプログラミング初学者です。以下のリンクの問題を解いている時にリストをcopy()関数を使ってコピーしたところ、コピーする前の元のリストもコピーして新しく作ったリスト同様変更されてしまいます。
[問題リンク] https://atcoder.jp/contests/abc074/tasks/arc083_b
コードでは、入力からリストAを作成し、realAにコピーします。その後、realAをいじっています(具体的にはワーシャルフロイド法)。コピーしてからはAに触れていないし、AとrealAの参照IDも違うので、AがrealAと同様に値が代入されるというようなことはないと思うのですが、Aの値が変更されてしまいます。原因がわかる方がいっらっしゃいましたら、教えていただけると幸いです。よろしくおねがいします。
コード
Python
1# 入力 2''' 3< 入力例 > 43 50 1 3 61 0 2 73 2 0 8''' 9N = int(input()) 10A = [list(map(int, input().split())) for _ in range(N)] 11 12# AをrealAにコピー 13realA = A.copy() 14 15# realAをいじる前のAの表示と参照IDの表示 16for a in A: 17 print(a) 18print("id = {}\n".format(id(A))) 19 20#------ ここからrealAをいじる(ワーシャルフロイド法) ------# 21 22for i in range(N): 23 realA[i][i] = 0 24 25for k in range(N): 26 for s in range(N): 27 for t in range(N): 28 realA[s][t] = min(realA[s][t], realA[s][k] + realA[k][t]) 29 30#---------------------------------------------------# 31 32# realAをいじったあとのAの表示と参照IDの表示 33for a in A: 34 print(a) 35print("id = {}\n".format(id(A))) 36 37# realAの表示と参照IDの表示 38for ra in realA: 39 print(ra) 40print("id={}\n".format(id(realA))) 41
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/20 07:35