0

Python 2.7.3 - Debian 7 - 32 ビット

リスト(リストアド)をリスト(タブラ)内に追加しようとしていますが、タブラが印刷されると、タブラすべての要素が同じであり、最後に追加されたリストです!!!!

tabla = []
listado = [0,0,0]    
lista_base = range(100)                       

for elemento in lista_base:
    listado[0] = elemento
    listado[1] = elemento+1
    listado[2] = elemento+2
    tabla.append(listado)       # <--- What is wrong here ??
    print(listado)              # <--- This works fine. It is print each *listado*.

print(tabla)                    
4

2 に答える 2

1

コピーではなく、同じリストを何度も操作しています。

代わりに、ループ内に新しいリストを作成します。

for elemento in lista_base:
    listado = [elemento, elemento + 1, elemento + 2]
    tabla.append(listado)

またはリストのコピーを作成します。

for elemento in lista_base:
    listado[0] = elemento
    listado[1] = elemento+1
    listado[2] = elemento+2
    tabla.append(listado[:])

where[:]は、すべての要素の完全なスライスを返します。モジュールを使用list(listado)またはインポートして、既存のリストのコピーを作成することもできます。copycopy.copy(listado)

リストを別のリストに追加すると、参照が追加されるだけなので、ループ内で変更し続けた同じリストへの多くの参照がコードによって作成されます。

すべてのループでタブラを印刷していれば、何が起こっているかを見ることができたでしょう。すべてのループ反復での印刷listadoは、そのリストの状態がその反復に対して正しいことを示しているだけであり、そのリストへのすべての参照がtablaそれに伴って変化していたことを示しているわけではありません。

>>> tabla = []
>>> listado = [0, 0, 0]
>>> for elemento in range(3):
...     listado[0] = elemento
...     listado[1] = elemento+1
...     listado[2] = elemento+2
...     tabla.append(listado)
...     print 'tabla after iteration {}: {!r}'.format(elemento, tabla)
... 
tabla after iteration 0: [[0, 1, 2]]
tabla after iteration 1: [[1, 2, 3], [1, 2, 3]]
tabla after iteration 2: [[2, 3, 4], [2, 3, 4], [2, 3, 4]]

すべてのtablaリストが一緒に変化することに注目してください。実際、それらはすべて同じリストです。代わりに新しいリストを作成すると、期待どおりに動作します。

>>> tabla = []
>>> for elemento in range(3):
...     listado = [elemento, elemento + 1, elemento + 2]
...     tabla.append(listado)
...     print 'tabla after iteration {}: {!r}'.format(elemento, tabla)
... 
tabla after iteration 0: [[0, 1, 2]]
tabla after iteration 1: [[0, 1, 2], [1, 2, 3]]
tabla after iteration 2: [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
于 2013-08-10T11:08:30.737 に答える
1

同じリストの内容を変更し、tabla. そのため、 のすべてのリストは、最後に追加さtablaれたものと同じになります。list

ループのたびに新しいリストを作成する必要があります。ループを次のように変更してみてください。

for elemento in lista_base:
    listado = [elemento, elemento+1, elemento+2]
    tabla.append(listado)     
于 2013-08-10T11:08:37.230 に答える