2011-10-12 10 views
25

He encontrado lo que creo que es un comportamiento extraño en Python, y me gustaría que alguien lo explique si es posible.Anexando a listas 2D en Python

He creado una lista vacía 2D

listy = [[]]*3 

print listy 

[[], [], []] 

Los siguientes trabajos como era de esperar:

listy[1] = [1,2] rendimientos [[], [1,2], []]

listy[1].append(3) rendimientos [[], [1,2,3], []]

Sin embargo, cuando Anexar a una de las listas vacías, python se agrega a TODAS las sublistas, de la siguiente manera:

listy[2].append(1) rendimientos [[1], [1,2,3], [1]].

¿Alguien me puede explicar por qué ocurre este comportamiento?

+4

Me pregunto cuántas veces por mes se me pregunta esto. Sin duda, esta es una de las preguntas más frecuentes de todos los tiempos sobre Python (y no solo sobre Stack Overflow). De las preguntas frecuentes en los documentos oficiales de Python: [¿Cómo creo una lista multidimensional?] (Http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list) –

Respuesta

44

No ha creado tres diferentes listas vacías. Creó una lista vacía, y luego creó una nueva lista con tres referencias a esa misma lista vacía. Para solucionar el problema de utilización de este código en su lugar:

listy = [[] for i in range(3)] 

El funcionamiento de su código de ejemplo ahora da el resultado que probablemente esperaba:

>>> listy = [[] for i in range(3)] 
>>> listy[1] = [1,2] 
>>> listy 
[[], [1, 2], []] 
>>> listy[1].append(3) 
>>> listy 
[[], [1, 2, 3], []] 
>>> listy[2].append(1) 
>>> listy 
[[], [1, 2, 3], [1]] 
+0

+1 para una explicación detallada – heltonbiker

+0

Esto tiene mucho sentido. Gracias. –

12

[[]]*3 no es lo mismo que [[], [], []].

Es como si hubieras dicho

a = [] 
listy = [a, a, a] 

En otras palabras, las tres referencias de la lista se refieren a la misma instancia de la lista.