Corrija o código: Evite modificar uma lista

Sua amiga está tentando escrever uma função que realize as seguintes transformações:

x = [3, 3, 3, 3, 3, 3, 3]

// Cada vez que x é chamada, os seguintes resultados são exibidos:

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]

Observação: A função change() não deve modificar a lista original. Após cada chamada da função, a variável x original ainda deve ser igual a [3, 3, 3, 3, 3, 3, 3].

Ela cria o seguinte 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

Ops! O código parece modificar a lista original. Corrija esse código para que a função não modifique mais a lista original.

Veja abaixo:

Exemplos

x = [3, 3, 3, 3, 3, 3, 3]

// O que queremos:
change(x, 2) => [3, 2, 1, 1, 1, 2, 3]

change(x, 2) => [3, 2, 1, 1, 1, 2, 3]

// O que obtemos:
change(x, 2) => [3, 2, 1, 1, 1, 2, 3]  // Até aqui, tudo certo...

change(x, 2) => [3, 1, -1, -1, -1, 1, 3] // A lista foi modificada :(

Observações

  • Se isso parecer confuso, copie e cole o código incorreto em um ambiente REPL e experimente-o para entender o que a função está fazendo.
  • Dica: Tente criar uma cópia da lista de entrada.
  • Se isso parecer familiar, faz parte de uma solução para o problema Tapete concêntrico.