Comportamiento de adición de lista de Python

Realmente no sé cómo formular la pregunta …

Supongamos que hago lo siguiente:

>>> l = [[]]*2 >>> l [[], []] >>> l[0].append(1) >>> l [[1], [1]] 

¿Por qué 1 se anexa a ambas listas?

[[]]*2 es una lista de dos referencias a la misma lista . Le estás agregando y luego viéndolo dos veces.

Porque en realidad solo hay una lista. Considera esto:

 >>> l = [[]] >>> l2 = l*2 >>> l2[0] is l[0] True >>> l2[1] is l[0] True 

*2 realizado en una lista no copia la lista pero devuelve una lista de longitud 2 con la misma referencia.

Lo que probablemente querías era esto:

 >>> l = [[] for _ in xrange(2)] 

Como @Asterisk menciona en un comentario, todas las colecciones comunes exponen el mismo comportamiento. Como regla general, por lo tanto, es mejor usar solo la multiplicación en tipos inmutables con valor semántico .

Así es como inicializo una lista de listas. Las filas varían más lentamente.

 nrows = 3; ncols = 5 l_of_ls = [[0]*ncols for i in range(nrows )] for rix, r in enumerate(l_of_ls): for cix, c in enumerate(r): print rix, cix, 'val = ',c 

RESULTADO

 0 0 val = 0 0 1 val = 0 0 2 val = 0 0 3 val = 0 0 4 val = 0 1 0 val = 0 1 1 val = 0 1 2 val = 0 1 3 val = 0 1 4 val = 0 2 0 val = 0 2 1 val = 0 2 2 val = 0 2 3 val = 0 2 4 val = 0 

También vale la pena señalar para fines de indexación

 for rix in range(nrows): for cix in range(ncols): print l_of_ls[rix][cix], print 

RESULTADO

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Mostrando la diferencia con el diseño de la memoria:

 listOfLists = [[]] * 3 listOfListsRange = [[] for i in range(0, 3)] 

introduzca la descripción de la imagen aquí