python在列表中添加列表意外行为

时间:2013-08-10 11:05:32

标签: python list add

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)                    

2 个答案:

答案 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)