Imutabilidade de Strings no Python
Tags: python
Published: 2022-06-12 00:13:34

Você provavelmente já ouviu a seguinte frase:

Strings no Python são objetos imutáveis!

E foi correndo para o seu terminal escrever o seguinte código:

```

palavra = "abc"
palavra = "def" 
print(palavra)
```

```
  # Imprime "def"
```
Talvez tenha se perguntado por que esse programa funcionou... Afinal, se strings são objetos imutáveis no Python, eu não estou alterando a variável palavra de "abc" para "def"? Ou seja, "mutando" esse valor?

Mais ou menos... Na verdade, estamos alterando a variável – que antes referenciava a string "abc" e passou a referenciar a string "def" – mas o valor "abc" não foi alterado!

Mudando a referência da variável "palavra"

Para alterar o valor, ou seja, alterar a string imutável "abc" deveríamos fazer o seguinte:


```
palavra = "abc"
print(palavra[0]) 
```

```
 # Imprime o primeiro caractere, no caso "a "
```

```
palavra[0] = "x"  # Tenta alterar o primeiro caractere de "abc" para "x"
```
Ao executar esse exemplo, você vai obter o seguinte erro:

TypeError: 'str' object does not support item assignment

Já que strings no Python são imutáveis, não podemos atribuir um novo valor a uma string depois de criada – como tentamos fazer com palavra[0] = "x". Note que escrever palavra = alguma_coisa e depois palavra = outra_coisa é alterar qual objeto nossa variável referencia, mas não o valor do objeto em si ("abc").

Mutável vs Imutável
Talvez seja mais fácil entender se compararmos com o exemplo de algum objeto mutável. Para isso, vamos utilizar a Lista (list):

```
lista = ["a", "b", "c"] 
```
 

```
# Cria uma lista com 3 elementos onde cada elemento da lista é um caractere
```

```
palavra = "abc"  # Cria uma string com 3 caracteres

```

```
lista[0] = "x"
print(lista)  # Imprime ['x', 'b', 'c']
```

```
palavra[0] = "x"  # TypeError!
```
Como listas são objetos mutáveis em Python, a gente pode alterar o seu valor depois de criada. No caso, alteramos o valor do primeiro elemento da lista de "a" para "x".

Imutabilidade e economia de memória
Uma consequência interessante de objetos imutáveis é a economia de memória. Já que a string é imutável, significa que não importa quantas variáveis referenciem esta string, não precisamos nos preocupar em alocar memória múltiplas vezes (uma vez para cada variável), pois não existe o risco de o valor ser alterado.

```

x = "abc"  # Reserva um espaço de memória para armazenar o valor "abc"
y = "abc"  # Referencia o mesmo espaço de memória reservdo para "abc"
```

```
print(id(x) == id(y))  # Vai imprimir True!

```
Podemos verificar o endereço de memória de um objeto utilizando o método id(obj). No exemplo acima, declaramos duas variáveis diferentes com o valor "abc" em cada uma delas. Porém, pelo fato de "abc" ser um valor imutável, o Python otimizou a utilização de memória e fez com que ambas variáveis (x e y) apontassem (ou referenciassem) para o mesmo endereço de memória onde "abc" está armazenado.

Mais uma vez, vamos utilizar um exemplo utilizando listas (objeto mutável) para entender melhor:


```
x = ["a", "b", "c"]
y = ["a", "b", "c"]
```

```
print(id(x) == id(y))  # Vai imprimir False!

```
O exemplo acima vai imprimir False pois, apesar das listas x e y armazenarem os mesmos valores (3 elementos, onde cada elemento é um caractere), o interpretador Python vai reservar o espaço de memória necessário para as duas listas, pois listas são objetos mutáveis!