変数 b が指すリストを代入した変数 a の順序を変更すると、変数 b のリストまで変更されてしまう

投稿者: Anonymous

bをランダムにしないよう、わざわざa=bをしているのに、なぜかiがランダムに表されます。

b = [1,2,3,4,5,6,7]
a = b
for i in b:
    random.shuffle(a)
    c = a
    print(i)
#1,4,5,2,7,3,6

当たり前ですがrandomをコメント化すると順通り表示されます。

b = [1,2,3,4,5,6,7]
a = b
for i in b:
    # random.shuffle(a)
    c = a
    print(i)
#1,2,3,4,5,6,7

for分のbすなわちiを妨害しないためには、どうすればよいでしょうか。
python 3.5.2です。

解決

リストのコピーは

a = b[:]

とするのが一般的なイディオムです。

a = list(b)

とする方法もあります。もちろんcopyでもできますが、intのコピーなら大鉈を振るうこともないかと。

追記:コメントに「本来bにはdictの二重配列が入るためその方法a=b[:]は使用できませんでした。」と重要な追加がありました。質問本文が編集されるまではこの回答は残しておきます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *