【Python】リスト(配列)の繰り返しの注意点

Pythonのlistで同じ要素を繰り返して書く場合は、リストの掛け算のように

data_list = [1, 2, 3] * 5
print(data_list)

とすると、

のようにリストの要素を繰り返したリストを取得することができます。

ただ、ここで注意したいのが、各要素のオブジェクト(メモリ)を繰り返してリストが生成されています。

試しに各要素のIDも繰り返されています。

つまり、同じメモリの値が繰り返されている事になります。

そのため、例えば、リストのリスト(二次元のリスト)を作成し、1つの要素だけを変更してみると、下図のように他の要素まで変更されてしまいます。

しかし、一見同じように一次元のリストの繰り返しでは、他の要素は変更されません。

この差は何なのか?というと、Pythonの語彙力がなくてうまく説明できないのですが、値を代入した時に変数のIDが変わるか?変わらないか?の違いによって、差が出ます。

例えば、変数に値を代入すると、IDの値も変わります。

しかし、リストの要素に値を代入しても、リストの変数のIDは変わりません。

こういう事をなんと言うのか???

 

という事で、リストやクラスオブジェクトを * を使ってリストの繰り返しを作る場合は、メモリも同じメモリが繰り返されている事に注意しておかないと、1つの要素を変更したときに他の要素も変更されてしまうので、気を付けましょう!

 

と、今日、この症状のバグにハマっていたので、戒めでこの記事を書いています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください