2011-11-20 14 views
8

Tengo un ligero problema para comprender el comportamiento de las listas.Asignación de lista a un valor en esa lista

Mi pregunta ejercicio es: Dibuje un modelo de memoria que muestra el efecto de las siguientes afirmaciones:

values = [0, 1, 2] 
values[1] = values 

Mi idea era que la ejecución de estas declaraciones cambiará la lista para algo como esto [0, [0, 1, 2], 3] , en otras palabras, la segunda declaración agregará el segundo valor en la lista (1) pero cuando ejecuto estas instrucciones y luego imprimo la lista en el shell de Python (3.2) obtengo el siguiente resultado:

[0, [...], 2] 

Algo le ha pasado a la segunda entrada, pero no estoy seguro de qué, ¿alguien puede explicar lo que pasó?

Gracias, Damian

Respuesta

13

Has creado una estructura recursiva de datos. El segundo elemento en la lista es una referencia a la lista en sí. Cuando imprima esto, normalmente esperaría ver la lista original en segundo lugar, como sugiere en su pregunta.

Sin embargo, no se está insertando una copia de la lista original, que va a insertar una referencia a la lista real. Entonces, el segundo elemento debe imprimir toda la lista. Pero, el segundo elemento de este segundo elemento es en sí mismo una referencia a la lista, por lo que cuando imprime su segundo elemento, ... Python maneja con gracia al mostrar [...] ya que la única otra solución es presentar un conjunto infinito de listas anidadas

Imagínese la siguiente manera: después de su asignación a values[1], la lista puede ser pensado para parecerse a esto:

[0, <pointer to itself>, 2] 

Por supuesto, <pointer to itself>, cuando se imprime, se parece a:

[0, <pointer to itself>, 2] 

Cuando se pone todo esto junto, se obtiene:

[0, [0, <pointer to itself>, 2], 2] 

Pero, por supuesto, para imprimir más interna que <pointer to itself>, también, debe ser impreso:

[0, [0, [0, <pointer to itself>, 2], 2], 2] 

... y así sucesivamente. Son tortugas hasta abajo.

+0

+1 para las tortugas :) –

+0

@Bryan Oakley, gracias por su respuesta, es una gran explicación. Todo se reduce a una referencia/copia sobre la que debo estar más atento. –

3

Usted está insertando literalmente una lista en sí mismo. La lista resultante no se puede imprimir más porque algo va en un círculo:

values = [0, 1, 2] 
values[1] = values 
# so the list now looks like 
[0, values, 2] 
# so we expand the variable and get 
[0, [0, values, 2], 2] 
# and so on 
[0, [0, [0, values, 2], 2], 2] 
# as this will never end instead Python prints 
[0, [...], 2] 

Así [...] significa que la lista contiene en sí.

0

el que funcione para usted es:

values = [0, 1, 2] 
values[1] = values[:] # or list(values) 

Para obtener más información de la copia de las listas de referencias y ver here.

+2

Estoy bajando la votación porque esto no responde la pregunta. La pregunta no es cómo almacenar una copia de una lista en la lista. La pregunta es: "explica qué sucede cuando configuras un elemento en una lista para que sea una referencia a sí mismo". Esta respuesta no ofrece ninguna explicación, solo una solución. Si bien lo que dices es un consejo muy útil, no es útil en el contexto de esta pregunta. –

+1

@Bryan Oakley: aunque no responde la pregunta original, esta es la única entrada que realmente te dice cómo hacerlo, y para ese enfoque pragmático definitivamente merece un voto positivo. –

Cuestiones relacionadas