Mutabilidad de listas
La sintaxis para acceder a elementos de una lista es la misma que para acceder a los caracteres de una cadena: el operador corchete. La expresión dentro de los corchetes especifica el índice. Recordemos que los índices comienzan en 0.
print(quesos[0]) # Imprime: Cheddar
A diferencia de las cadenas, las listas son mutables porque pueden cambiar el orden de los elementos de una lista o reasignar un elemento en una lista. Cuando el operador corchete aparece en el lado izquierdo de una asignación, este identifica el elemento de la lista que será asignado:
numeros = [17, 123]
numeros[1] = 5
print(numeros) # Imprime: [17, 5]
El elemento en la posición uno de numeros, que era 123, ahora es 5.
Puedes pensar en una lista como una relación entre índices y elementos. Esta relación se llama mapeo. Cada índice mapea a uno de los elementos.
Los índices en una lista funcionan de la misma manera que los índices de una cadena.
Alias de mutables
Si igualamos una lista a otra, no se copia el contenido de una a otra, sino que se crea un alias. Esto ocurre para todos los tipos de datos que son mutables.
Veamos un ejemplo:
lista_original = [1, 2, 3]
alias_lista = lista_original
alias_lista.append(4)
print(lista_original) # Salida: [1, 2, 3, 4]
Aquí alias_lista referencia al mismo objeto que lista_original, por lo que cualquier cambio en alias_lista también afectará a lista_original.
Copiar mutables
Si quieres realizar una copia de un tipo de datos mutable, como son las listas, puedes usar deepcopy() para crear una copia totalmente independiente:
import copy
lista_original = [1, 2, 3]
alias_lista = copy.deepcopy(lista_original) # Crea una copia completa
alias_lista.append(4)
print(lista_original) # Salida: [1, 2, 3]
print(alias_lista) # Salida: [1, 2, 3, 4]