15

私はリストのリストを持っていますmysolution:

>>>mySolution
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> mySolution[0][0] = 1    
>>> mySolution
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

意図した出力:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

リストのリストの最初の要素がすべて 1 に変更されるのはなぜですか? 最初のリストの最初の要素を 1 に変更したいだけです。

4

4 に答える 4

3

これはうまくいっていることに注意してください:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
mySolution[0][0] = 1    
print mySolution

>>> 
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

それはすべて、をどのように初期化したかによって異なりますsolution。これ

mySolution = [[0, 0, 0, 0]]*4
mySolution[0][0] = 1    
print mySolution

与える

>>> 
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
>>> 

ここで、 の各配列[0, 0, 0, 0]mySolutionの初期化配列のコピーであるため[0, 0, 0, 0]です[[0, 0, 0, 0]]*4。最初の配列の最初の要素を変更すると、そのコピーも変更されます。

この初期化mySolution = [[0, 0, 0, 0] for x in range(4)]では、配列をコピーするのではなく、[0,0,0,0]4 回追加することで、期待どおりの結果が得られます。

于 2013-09-22T17:52:47.803 に答える
3

含まれているすべてのリストは実際には同じリストであるためです。あなたがするとき:

l = [0, 0, 0, 0]
my_solution = [l, l, l]

次に、my_solution[0]my_solution[1]my_solution[2]は同じオブジェクト ( l) への参照です。

1 つの場所でリストを変更すると、すべての場所が変更されます。これは、リストが変更可能なオブジェクトであるためです。

代わりに、複数のリストを使用してください。

l1 = [0, 0, 0, 0]
l2 = [0, 0, 0, 0]
l3 = [0, 0, 0, 0]
my_solution = [l1, l2, l3]

これは意図したとおりに機能します。

于 2013-09-22T17:31:27.783 に答える