BETA

初心者日記(14)『リストをa =bでコピーすると、何故かaを更新するとbも更新される件』

投稿日:2020-07-05
最終更新:2020-08-06
[1,2,3,4,5,6,7,8,9,10]  

というリストがあり、これを降順に並び変えるコードを書きたい。
そこで、for文を使って後ろの要素からコピーしたリストへ代入していくことにしました。(値渡し)
(sort(reverse =True)を使えばいいじゃんとかは考えない)

b = list(range(1,11))  

a = b  
j = -1  

for i in range(10):  
    a[i] = b[j]  
    j -= 1  

print(a)  

問題なく降順に代入するコードが書けました。しかしこれを実行すると不思議なことに

[10,9,8,7,6,6,7,8,9,10]  

という結果になってしまいます。最初はちゃんと降順になっていますが、なぜか真ん中から増えています。これはリストaを更新すると元のリストbも更新されてしまうために起こります。(参照渡し)

最初の代入後のリストb  
[10,2,3,4,5,6,7,8,9,10]  

これを防ぐ方法を調べたところ、どうやら3行目の『a = b』を『a = list(b)』に変えるだけで元のリストが更新されなくなるらしい。

python リストの要素が勝手に書き換わってしまう?

実際に書き換えてみた。

b = list(range(1,11))  

a = list(b)  
j = -1  

for i in range(10):  
    a[i] = b[j]  
    j -= 1  

print(a)  

これを実行すると

[10,9,8,7,6,5,4,3,2,1]  

しっかりと目的の結果が得られた。リストをコピーするときは気を付けよう。

追記:
一次元配列だとこの方法でできたが、二次元配列だとこの方法を使っても参照渡し扱いになってしまった。二次元配列の値渡しの仕方はまだわかっていない。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

tnodino(つのでぃの)のブログ。日頃の内容を記事にしています。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう