Mi pregunta está relacionada con el siguiente bucle:comprensión de bucles con referencia a la lista de contenedores pitón
x=[[1,2,3],[4,5,6]]
for v in x:
v=[0,0,0]
aquí si imprime x se obtiene [[1,2,3], [4,5, 6]] ... por lo que v cambiado no es realmente una referencia a la lista en x. Pero cuando se hace algo como lo siguiente:
x=[[1,2,3],[4,5,6]]
for v in x:
v[0]=0; v[1]=0; v[2] =0
entonces obtendrá como x [[0,0,0], [0,0,0]]. Esta un poco difícil si se pone dentro de la lista x es bastante larga, e incluso hacer algo como esto:
x=[[1,2,3],[4,5,6]]
for v in x:
for i in v:
i = 0
me dará como x [[1,2,3], [4,5,6]]. Mi mejor opción es usar para i en xrange (0,3): v [i] = 0 .. Aunque todavía me gustaría saber qué está pasando aquí y cuáles son las otras alternativas cuando tengo una lista de listas o más listas anidadas.
Esta es una respuesta mejor que Sven porque intenta explicar un poco de lo que está sucediendo, en lugar de simplemente dar una receta para ser seguido a ciegas. (Al menos, eso es todo lo que veo ahora en Sven, quizás lo editará). –
Gracias por la explicación hasta el momento. Entonces, podemos mutar el elemento de lista que 'v' señala en el cuerpo del bucle, usando' v [:] = ... ', porque este elemento de lista ** es una lista en sí misma **. Ahora, si solo fuera un número entero o algo más que una lista, ¿hay alguna manera de mutarlo sin cambiar el encabezado del bucle? –
@ Jan-PhilipGehrcke: algunos tipos, como int, son inmutables. Eso significa que una instancia de ese tipo nunca puede cambiar su valor. Los tipos inmutables comunes son tipos numéricos, cadenas y tuplas. – recursive