2016-05-05 13 views
0

が、私は番号のリスト[1,2,3,4,5]を持っているのと同じ方法をシャッフルします。私は[1,2,3,4,5]の異なる順列を含むリストを作成したいと思います(リストのリストになります)。Pythonの:forループ内のシャッフルは毎回

例えば、私は [[1,4,5,3,2]、[3,1,4,5,2]、[5,1,2,4,3]]のようなものが必要です。

import random 
from random import shuffle 

superlist = [] 
littlelist = [1,2,3,4,5] 

for i in range(1, 4): 
    random.shuffle(little_list) 
    superlist.append(little_list) 
print(superlist) 

これは、だから私のforループの中に、 'ランダムシャッフル' は同じものを生産する

[[2, 5, 4, 3, 1], [2, 5, 4, 3, 1], [2, 5, 4, 3, 1]] 

を出力します。私は時間をかけてそれを播いたが、同じ問題があった。あなたが場所にリストをシャッフルrandom.shuffle呼び出すと

答えて

2

、あなたはコピーを作成されていません。その後、superlistlittle_listを追加していますが、それをシャッフルするたび、あなたは同じリストをシャッフルしています。 Pythonで

for i in range(1, 4): 
    random.shuffle(little_list) 
    superlist.append(list(little_list)) 
print(superlist) 

すべてはオブジェクトへの参照を操作することで動作します:あなたが他のオブジェクトにオブジェクト(例えばlittle_list)を入れたときに、あなたがやっているすべてはある

することは、あなたは違いが表示されますコピーを追加してみsuperlist作るオリジナルlittle_listへの参照を保持します。あなたが特にオブジェクトをコピーするように頼まない限り、Pythonは決してオブジェクトのコピーを作成しません。 list(...)コンストラクタを呼び出すことで簡単にリストをコピーできますが、元のものから参照をコピーするだけなので、superlistをコピーしてリストを操作すると元のsuperlistに戻ってそれらの変更が表示されます。

+0

私は同じリストをシャッフルしていることを知っていますが、ランダムにシャッフルしていると、スーパーリストに別のものを追加することになると思いました。 – surelyourejoking

+2

いいえ、あなたはsuperlistしているだけで、 '[little_list、little_list、little_list]'、同じサブリストの各時間で、すべてのは、あなたが 'little_list'がsuperlist''に3回表示されているに作る変更。 – Duncan

+0

私は参照してください。したがって、あなたのメソッドは、little_listを追加するのではなく、ちょうどシャッフルされたlittle_listのコピーを追加します。 little_listを再びシャッフルしても、このコピーには影響しません。あれは正しいですか? – surelyourejoking