2017-03-04 9 views
-1

t=[[False]*2]*2と入力すると、リスト[[False, False], [False, False]]が得られます。しかし、t[0][0] = Trueと入力するとt[1][0]Trueに変わり、私には[[True, False], [True, False]]が残っています。私は[[True, False], [False, False]]がほしいと思う。 2番目の選択肢として、t=[[False]*2, [False]*2]を割り当ててt[0][0] = Trueを変更すると、私の望むものが得られますが([[True, False], [False, False]])、実際のリストはそれよりもはるかに大きいので、オプション2を使用しないでください。同様の問題であると考えましたリストをコピー対クローニングので、私が試したに: ([[False]*2])*2Python:複製しないで複製リストを複製する方法

([False]*2)*2

[[False]*2][:]*2

t = [False]*2 t = t*2

list([False]*2)*2

list([[False]*2])*2

[list([False]*2)]*2。これらのどれも働かなかった。パッケージをインポートせずにこれを行う方法はありますか?

答えて

0

リストの理解を使用してリストを構築すると、各リストオブジェクトは同じ参照を共有するのではなく、一意のアドレスを指します。

t = [[False for x in range(2)] for y in range(2)] 
t[0][0] = True 
t # [[True, False], [False, False]] 
+0

もちろんです!私はどこにでもリストの理解を使用しましたが、ここでそれを使うのを忘れました。ところで、 'xrange'はPython 3では動作しません(ちょうど' range'です)。リストの理解なしにこれを行う方法はありませんか? –

+0

@ P.Gordy itertools.repeat(val、numberoftimes)もありますが、リストの理解はより速くなります。そしてもしあなたが 'repeat'を入れ子にしたら、それは本当に醜いです。 – MSeifert

+1

'[False for x in range(2)]'は実際には '[False] * 2'です。 2番目のものだけが 'for y in range(2)'を持つ必要があります。 –