1

基本的に私がやろうとしているのは、ネストされたリストを作成し、その要素の1つの値をリスト内の他の要素の関数として設定することです。

>>> a = [[1]*5]*5
>>> a
[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
>>> a[2][2] = a[0][2] + a[2][1]
>>> a
[[1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1]]
>>> a[3][2]   
2
>>> a[4][2]
2
>>> a[4][4]
1

a [2] [2]の値を設定しただけですが、3列目のすべての要素に同じ値が設定されています。正確には何が起こっているのでしょうか。また、どのようにして目的の動作を実現できますか?

4

2 に答える 2

2

何が起こるかというとa、同じサブリストへの5つの参照が含まれることになります。1つのサブリストを変更すると、すべてが変更されます。

これを確認するid()には、各サブリストに適用してください。

>>> map(id, a)
[8189352, 8189352, 8189352, 8189352, 8189352]

ご覧のとおり、これらはすべて同じIDを持っています。つまり、同じオブジェクトです。

修正するには、交換してください

a = [[1]*5]*5

a = [[1]*5 for _ in range(5)]

これで、サブリストは独立したオブジェクトになります。

>>> map(id, a)
[21086256, 18525680, 18524720, 19331112, 18431472]
于 2013-03-27T06:58:06.153 に答える
1

問題は、リストaに同じリストへの5つの参照が含まれていることです。あなたはこのようなことをする必要があります:

a = []
for _ in range(5):
    a += [[1] * 5]
于 2013-03-27T06:58:47.407 に答える