Mutável e Imutável em Python

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.

YouTube Video