2011-08-31 7 views
17

no se sabe muy bien cómo formular la pregunta ...Python comportamiento de la lista de datos anexados

Supongamos que hago lo siguiente:

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

¿Por qué 1 obtiene adjunta a ambas listas?

+4

Este tema se discute en http://docs.python.org/faq/programming.html#id38 resp. http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list. – glglgl

Respuesta

17

[[]]*2 es una lista de dos referencias a la misma lista. Usted lo está agregando y luego lo ve dos veces.

11

Porque en realidad solo hay una lista. Considere esto:

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

*2 realiza en una lista no copiar la lista pero devolver una lista de longitud 2 llena con la misma referencia.

Lo que probablemente quería era esto:

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

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

+0

parece * 2 realizado en el diccionario no se copia también ... – Asterisk

+0

y conjuntos ........ – Asterisk

1

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 digno de mención 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 
1

Exposición de la diferencia con la distribución de la memoria:

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

enter image description here

Cuestiones relacionadas