您一遍又一遍地操作同一个列表,而不是复制。
改为在循环中创建一个新列表:
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[:])
其中[:] 返回所有元素的完整切片。您也可以使用list(listado) 或导入copy 模块并使用copy.copy(listado) 创建现有列表的副本。
将一个列表附加到另一个列表只会添加一个引用,因此您的代码会创建许多对您在循环中不断更改的同一个列表的引用。
如果您在每个循环上打印 tabla,您就可以看到发生了什么。在每次循环迭代中打印 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]]