2011-06-15 17 views
7

Creo una lista de listas y quiero agregar elementos a las listas individuales, pero cuando intento agregar a una de las listas (a[0].append(2)), el elemento se agrega a todas las listas.¿Por qué foo.append (bar) afecta a todos los elementos en una lista de listas?

a=[] 
b=[1] 

a.append(b) 
a.append(b) 

a[0].append(2) 
a[1].append(3) 
print a 

Da: [[1, 2, 3], [1, 2, 3]]

Mientras que yo esperaría: [[1, 2], [1, 3]]

Cambiar la forma construyo la lista inicial de listas, haciendo b un flotador en lugar de una lista y poner los soportes en el interior .Append(), me da la salida deseada:

a=[] 
b=1 

a.append([b]) 
a.append([b]) 

a[0].append(2) 
a[1].append(3) 
print a 

da: [[1, 2], [1, 3]]

¿Pero por qué? No es intuitivo que el resultado sea diferente. Sé que esto tiene que ver con que haya multiple references to the same list, pero no veo dónde está sucediendo eso.

Respuesta

20

Esto se debe a que la lista contiene referencias a objetos. Su lista no contiene [[1 2 3] [1 2 3]], es [<reference to b> <reference to b>].

Cuando cambia el objeto (agregando algo al b), está cambiando el objeto en sí, no la lista que contiene el objeto. Para obtener el efecto que desea, su lista a debe contener copias de b en lugar de referencias a b. Para copiar una lista, puede usar el rango [:]. Por ejemplo,:

>>> a=[] 
>>> b=[1] 
>>> a.append(b[:]) 
>>> a.append(b[:]) 
>>> a[0].append(2) 
>>> a[1].append(3) 
>>> print a 
[[1, 2], [1, 3]] 
+0

Gracias, ahora tiene mucho sentido. – litturt

1

La clave es esta parte:

a.append(b) 
a.append(b) 

está anexando la misma lista dos veces, por lo tanto a[0]a[1] y aparecen referencias a la misma lista.

En su segundo ejemplo, está creando nuevas listas cada vez que llama anexa como a.append([b]), por lo que son objetos separados que se inicializan con el mismo valor flotante.

+0

Gracias, esta respuesta también se agregó a mi comprensión. – litturt

1

Con el fin de hacer una copia superficial de una lista, el lenguaje es

a.append(b[:]) 

que cuando se duplicó causará una de contar con dos nuevas copias de la lista b la que no le dará el fallo aliasing usted informe .

Cuestiones relacionadas