Lista 2D tiene un comportamiento extraño cuando se trata de modificar un solo valor [duplicado]

StackOverflow https://stackoverflow.com/questions/2739552

  •  02-10-2019
  •  | 
  •  

Pregunta

  

Duplicar posibles:
   en una lista de listas de Python

Así que soy relativamente nuevo en Python y estoy teniendo problemas con listas de trabajo 2D.

Aquí está mi código:

data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data

y aquí está la salida (formato para facilitar la lectura):

[['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None],
 ['Cell A1', None, None, None, None]]

¿Por qué cada fila se asignan el valor?

¿Fue útil?

Solución

Esto hace una lista con cinco referencias al mismo lista:

data = [[None]*5]*5

Usar algo como esto en su lugar, que crea cinco listas separadas:

>>> data = [[None]*5 for _ in range(5)]

Ahora se hace lo que espera:

>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None],
 [None, None, None, None, None]]

Otros consejos

A medida que el pitón referencia de la biblioteca de tipos de secuencias , que incluye listas, dice

  

Tenga en cuenta también que las copias son poco profundas; estructuras anidadas no se copian. Esto a menudo persigue a nuevos programadores de Python; considerar lo siguiente:

>>> lists = [[]] * 3
>>> lists
  [[], [], []]
>>> lists[0].append(3)
>>> lists
  [[3], [3], [3]]
  

Lo que ha sucedido es que [[]] es una lista de un solo elemento que contiene una lista vacía, por lo que los tres elementos de [[]] * 3 son (punteros) a esta única lista vacía. La modificación de cualquiera de los elementos de las listas modifica esta lista única.

Se puede crear una lista de las diferentes listas de esta manera:

>>> lists = [[] for i in range(3)]  
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
  [[3], [5], [7]]

En Python cada variable es un objeto, y por lo tanto una referencia. Que creó primero un conjunto de 5 Nones, y luego se construye una matriz con 5 veces el mismo objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top