コピーではなく、同じリストを何度も操作しています。
代わりに、ループ内に新しいリストを作成します。
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)
またはインポートして、既存のリストのコピーを作成することもできます。copy
copy.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]]