Corrige el código: Evita modificar una lista
Tu amiga está intentando escribir una función que realice las siguientes transformaciones:
x = [3, 3, 3, 3, 3, 3, 3]
// Cada vez que se llama a x, se muestran los siguientes resultados:
change(x, 0) // [3, 3, 3, 3, 3, 3, 3]
change(x, 1) // [3, 2, 2, 2, 2, 2, 3]
change(x, 2) // [3, 2, 1, 1, 1, 2, 3]
change(x, 3) // [3, 2, 1, 0, 1, 2, 3]Nota: La función change() no debe modificar la lista original. Después de cada llamada a la función, la variable x original debe seguir siendo igual a [3, 3, 3, 3, 3, 3, 3].
Ella escribe el siguiente código:
def change(x, times):
for i in range(len(x)):
j = 1
while j <= times:
if i >= j and i < len(x)-j:
x[i] -= 1
j += 1
return x¡Ups! Parece que el código modifica la lista original. Corrige este código incorrecto para que la función deje de modificar la lista original.
Observa lo siguiente:
Ejemplos
x = [3, 3, 3, 3, 3, 3, 3]
// Lo que queremos:
change(x, 2) => [3, 2, 1, 1, 1, 2, 3]
change(x, 2) => [3, 2, 1, 1, 1, 2, 3]
// Lo que obtenemos:
change(x, 2) => [3, 2, 1, 1, 1, 2, 3] // Hasta aquí, todo bien...
change(x, 2) => [3, 1, -1, -1, -1, 1, 3] // La lista se modifica :(Notas
- Si esto te resulta confuso, copia y pega el código incorrecto en un entorno REPL y experimenta con él para entender qué hace la función.
- Pista: Intenta crear una copia de la lista de entrada.
- Si esto te resulta familiar, forma parte de una solución para el problema Alfombra concéntrica.