Python 2.7.3 - Debian 7 - 32位
我正在尝试在列表( tabla )中添加列表( listado ),但是当 tabla 打印在 tabla 中的所有元素时em> tabla 是相同的,除了它是最后添加的列表!!!!
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)
答案 0 :(得分: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[:])
其中[:]
返回所有元素的完整切片。您还可以使用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]]
答案 1 :(得分:1)
您正在更改同一列表的内容,并在tabla
中添加对该列表的引用。因此,tabla
中的所有列表都与添加的最后一个list
相同。
每次在循环中都应该创建一个新列表。尝试将循环更改为:
for elemento in lista_base:
listado = [elemento, elemento+1, elemento+2]
tabla.append(listado)