Python: Tipos de Sequência
Entendendo melhor a estrutura por trás das sequências mais usadas da linguagem.
Tipos de sequência
Existem dois tipos de sequência em Python: simples e container. É natural que pela praticidade do Python (e pela abundância de poder de processamento e memóriam RAM que nos é acessível) pouca gente se preocupe com o uso adequado de cada uma delas, certo? NOT TODAY!
Sequências simples
- Armazenam itens de um só tipo de dado
- Armazenam o valor de cada item em seu próprio espaço de memória
uma string (ou str em Python) é um exemplo de sequência simples:
color_model = 'RGB'
Neste caso, a porção de memória alocada para a variável color_modeltambém armazena os valores R, G e B, que como podemos observar, são do mesmo tipo (str).
Sequências container
- Podem armazenar itens de diferentes tipos
- Não armazenam o valor de seus itens em sí, mas sim suas referências
uma lista (ou list em Python) é um exemplo de sequência container:
some_list = ['R', 43, 5.0]
Observe que em uma mesma lista, estamos armazenando três tipos diferentes: str, int e float. Certo? ERRADO! Estamos na verdade armazenando a referência (ou ponteiro) de cada um dos itens. Vale lembrar que todos os tipos de dados do Python são objetos!
OBS: uma lista assim não faria muito sentido, considere a mistura de tipos um mal necessário para o exemplo!
Sequências mutáveis e imutáveis
As sequências também podem ser classificadas entre mutáveis e imutáveis. Sendo basicamente (explicando de maneira muitíssimo sucinta), alteráveis ou não após sua criação.
Sequências mutáveis
- list, dict, set, byte array… Todas elas podem ser mudadas após a criação!
Podemos perfeitamente criar uma lista com três letras:
>>> letters = ['A', 'B', 'C']
>>> print(letters)
['A', 'B', 'C']
E modificá-la depois:
>>> letters.append('D')
>>> print(letters)
['A', 'B', 'C', 'D']
Sequências imutáveis
- str, tuple, frozenset… Servem a propósitos diferentes e não podem ser alteradas após a criação!
Que burro! Dá zero pra ele! Eu altero strings direto! — Clarice Lispector
Pois é meu jovem, Não é bem assim… Sempre que você altera uma string, você está na verdade criando outra(s) string(s)!
Observe o id da string name:
>>> name = 'Paul'
>>> id(name)
140026338047680
agora, ao concatenaremos o sobrenome, o id da string name mudará:
>>> name += ' Gilbert'
>>> id(name)
140026338057712
Ou seja, você não alterou o mesmo objeto! Você criou outra String e atribuiu a referência dela à variável name! Além disso, uma terceira string é criada:
'Paul' # string original
'Gilbert' # string que será concatenada a string original
'Paul Gilbert' # string resultante
Agora, imagine um caso onde você precise concatenar 50 strings, diferentes! Coitada da memória RAM!
Quer entender um pouco mais sobre mutabilidade/imutabilidade? Tem um material bem bacana aqui:
https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747
Conclusão
Estude caso a caso qual sequência usar! Não só por questão de performance, mas também de semântica!
Cya ;)