【问题标题】:python adding list inside list unexpected behaviorpython在列表中添加列表意外行为
【发布时间】:2013-08-10 11:05:32
【问题描述】:

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)                    

【问题讨论】:

    标签: python list add


    【解决方案1】:

    您正在更改同一列表的内容,并在您的tabla 中添加对它的引用。因此,tabla 中的所有列表都将与添加的最后一个 list 相同。

    您应该在每次循环中创建一个新列表。尝试将循环更改为:

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

    【讨论】:

      【解决方案2】:

      您一遍又一遍地操作同一个列表,而不是复制。

      改为在循环中创建一个新列表:

      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]]
      

      【讨论】:

        最近更新 更多