Mutável e Imutável em Python
Este artigo explica mutável e imutável em Python.
YouTube Video
Mutável e Imutável em Python
"Mutável" e "imutável" referem-se à mutabilidade de um objeto. Entender isso ajuda a evitar bugs inesperados e a gerenciar memória de forma eficiente.
O que é Mutável?
Objetos mutáveis podem ter seu estado interno alterado após a criação.
Principais Tipos de Dados Mutáveis
list
dict
set
- Classes definidas pelo usuário (se seus atributos puderem ser modificados)
Exemplo: Modificando uma Lista
1numbers = [1, 2, 3]
2numbers[0] = 100
3print(numbers) # [100, 2, 3]
Uma lista é um objeto mutável, e seus elementos podem ser modificados livremente.
O que é Imutável?
Objetos imutáveis não podem ser alterados após serem criados. Tentar modificá-los resulta na criação de um novo objeto.
Principais Tipos de Dados Imutáveis
int
float
str
tuple
bool
frozenset
Exemplo: Modificando uma String
1text = "hello"
2# text[0] = "H" # TypeError: 'str' object does not support item assignment
3
4text = "H" + text[1:] # Creates a new string
5print(text) # "Hello"
Strings são imutáveis, então você não pode modificá-las parcialmente.
Comparação entre Mutável e Imutável
1# Mutable example
2a = [1, 2, 3]
3b = a
4b[0] = 100
5print(a) # [100, 2, 3] -> a is also changed
6
7# Immutable example
8x = 10
9y = x
10y = 20
11print(x) # 10 -> x is unchanged
Como mostrado no exemplo acima, objetos mutáveis são compartilhados por referência, então eles podem afetar outras variáveis. Por outro lado, objetos imutáveis criam novas instâncias ao serem reassociados, deixando o valor original inalterado.
Inspecionando o Comportamento Interno Usando id()
Em Python, você pode usar a função id()
para verificar o ID de um objeto. O ID do objeto é semelhante a um endereço de memória.
1# Immutable int behavior
2a = 10
3print(id(a)) # e.g., 140715920176592
4a += 1
5print(id(a)) # e.g., 140715920176624 -> ID has changed
6
7# Mutable list behavior
8b = [1, 2, 3]
9print(id(b)) # e.g., 2819127951552
10b.append(4)
11print(id(b)) # Same ID -> only the content has changed
Conforme mostrado, um novo objeto é criado para tipos imutáveis, enquanto os tipos mutáveis são modificados no local.
Funções e Cuidado com Objetos Mutáveis e Imutáveis
Ao passar um objeto mutável para uma função, os dados originais podem ser modificados.
Exemplo: Uma Função que Modifica uma Lista
1def modify_list(lst):
2 lst.append(100)
3
4my_list = [1, 2, 3]
5modify_list(my_list)
6print(my_list) # [1, 2, 3, 100]
Exemplo: Uma Função que Modifica um Número
Por outro lado, tentar modificar um objeto imutável resulta na criação de um novo objeto.
1def modify_number(n):
2 n += 10
3
4my_number = 5
5modify_number(my_number)
6print(my_number) # 5 -> unchanged
Considerações Práticas
Evite Usar Objetos Mutáveis como Argumentos Padrão
1# Bad example
2def add_item(item, container=[]):
3 container.append(item)
4 return container
5
6print(add_item(1)) # [1]
7print(add_item(2)) # [1, 2] -> unintended behavior
8
9# Good example
10def add_item(item, container=None):
11 if container is None:
12 container = []
13 container.append(item)
14 return container
Como os argumentos padrão são avaliados apenas uma vez na definição da função, usar objetos mutáveis pode levar a efeitos colaterais inesperados.
Resumo
Para entender profundamente as variáveis e os tipos de dados em Python, é crucial compreender as diferenças entre mutáveis e imutáveis. Compreender essas características ajuda a evitar comportamentos indesejados no seu código e a escrever programas mais robustos e legíveis.
Você pode acompanhar o artigo acima usando o Visual Studio Code em nosso canal do YouTube. Por favor, confira também o canal do YouTube.