0

私はPython 3を使用しており、次のコードを使用しています:

import random
mat = [[0]*5]*5

for i in range (0,5) :
    for j in range (0,5)  :
        mat[i][j] = random.randint(10,50)

print (mat)

次のような結果が得られます。

[[26, 10, 28, 21, 15], [26, 10, 28, 21, 15], [26, 10, 28, 21, 15], [26, 10, 28, 21, 15], [26, 10, 28, 21, 15]]

行は互いに等しいですが、ループは問題ないようです。

何が問題ですか?

4

2 に答える 2

4

すべての内部リストは実際には同じオブジェクトのコピーであるため、それらの 1 つを変更すると、他のリストにも自動的に影響します。

>>> l = [[0]*5]*5
>>> [id(x) for x in l]
[155011468, 155011468, 155011468, 155011468, 155011468]

同じ ID は、すべてのインデックスが実際にはリスト内の同じオブジェクトを指していることを意味します。

>>> l[0][0] = 1  #modifying one, changes all of them
>>> l
[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]

を使用しlist comprehensionてこの問題を修正します。

>>> l = [[0]*5 for _ in xrange(5)]
>>> [id(x) for x in l]               #all lists are unique now
[155710028, 155710764, 155710700, 155710732, 155709996]

期待どおりに動作します:

>>> l[0][0] = 1
>>> l
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
于 2013-06-17T14:59:29.510 に答える
1

問題は次の行です。

mat = [[0]*5]*5

これは、5 つのゼロ () の単一のリストを作成し、その同じリスト[0]*5への参照をさらに 5 つ作成することです。

この問題を回避する解決策:

mat = [[0]*5 for _ in xrange(5)]

これは、すべてのリストが独立していることを意味する5つのゼロのリストを5回作成します。

于 2013-06-17T14:59:04.063 に答える