30334


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

[code]

    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
    
[/code]

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

[code]

    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
    
[/code]

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


CC BY-SA 3.0
2016-11-11T10:40:00.493
30326
2016-11-16T14:58:04.697
2016-11-16T14:58:04.697
3054
7973
question
python
変数 b が指すリストを代入した変数 a の順序を変更すると、変数 b のリストまで変更されてしまう


コピーを作成したい場合、  
`a = copy.copy(b)`  
のようにします。

[copy](http://docs.python.jp/3/library/copy.html?highlight=copy#module-copy)


CC BY-SA 3.0
2016-11-11T11:13:26.237
30327
2016-11-11T11:13:26.237
5044
30326
answer


<http://docs.python.jp/3.5/library/copy.html>

> Python において代入文はオブジェクトをコピーしません。

bの要素を気にせずbを保持する場合は`a = b`の代わりに以下のように浅いコピーを行って下さい。

[code]

    a = b.copy()
    
[/code]


CC BY-SA 3.0
2016-11-11T11:40:12.027
30328
2016-11-11T11:40:12.027
62
30326
answer


リストのコピーは

[code]

    a = b[:]
    
[/code]

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

[code]

    a = list(b)
    
[/code]

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

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


CC BY-SA 3.0
2016-11-11T17:12:11.843
30334
2016-11-11T17:19:07.933
2016-11-11T17:19:07.933
7837
7837
30326
answer