Variáveis, Tipos e Tipagem Dinâmica
Python é dinamicamente tipado: um nome pode se referir a diferentes tipos de objetos ao longo de sua vida, enquanto cada objeto ainda tem um tipo concreto em tempo de execução. Entender a semântica de referência evita bugs sutis com mutabilidade e estado compartilhado.
Receita
x = [1, 2, 3]
y = x # mesmo objeto de lista
y.append(4)
print(x) # [1, 2, 3, 4]
a: str = "oi"
print(type(a), isinstance(a, str))Quando usar isso:
- Depurando por que duas variáveis mutam juntas
- Escolhendo entre cópia vs referência compartilhada
- Adicionando dicas de tipo sem alterar o comportamento em tempo de execução
- Explicando Python para desenvolvedores de linguagens estaticamente tipadas
Exemplo de Trabalho
from copy import deepcopy
def demo_references() -> None:
original = {"items": [1, 2]}
alias = original
shallow = original.copy()
deep = deepcopy(original)
alias["items"].append(3)
shallow["items"].append(4)
deep["items"].append(99)
print("original:", original) # items mutados via lista interna de alias e shallow
print("shallow:", shallow) # o dicionário de nível superior é novo; a lista aninhada é compartilhada
print("deep:", deep) # totalmente independente
def demo_dynamic_typing() -> None:
value: int | str = 42
value = "quarenta e dois" # legal - o nome não está travado em int
print(value, type(value))
if __name__ == "__main__":
demo_references()
demo_dynamic_typing()O que isso demonstra:
- Atribuição vincula nomes a objetos -
alias = originalcompartilha o dicionário dict.copy()é superficial - objetos mutáveis aninhados permanecem compartilhadosdeepcopyduplica recursivamente estruturas aninhadas- Dicas de tipo usam
int | str, mas não impõem tipos em tempo de execução
Mergulho Profundo
Como Funciona
- Nomes vs objetos - Variáveis são entradas em um namespace (dicionário) apontando para objetos na heap.
- Contagem de referências - CPython rastreia a vida útil dos objetos; quando a contagem de referências chega a zero, a memória é recuperada.
- Objetos imutáveis -
int,str,tuple,frozensetnão podem ser alterados no local; "mutação" cria novos objetos. - Objetos mutáveis -
list,dict,setmudam no local; aliases veem as mesmas alterações. - LEGB - Ordem de busca de nomes: Local, Enclosing, Global, Built-in (abordado em profundidade no artigo sobre funções).
Tipos Principais em Resumo
| Categoria | Exemplos | Mutável? |
|---|---|---|
| Numérico | int, float, complex, Decimal | Não (revincula para alterar) |
| Texto/binário | str, bytes, bytearray | bytearray sim |
| Sequências | list, tuple, range | list sim |
| Mapeamentos | dict | Sim |
| Conjuntos | set, frozenset | set sim |
Notas do Python
# id() retorna a identidade do objeto; is compara a identidade
a = [1]
b = a
c = [1]
print(a is b) # True
print(a is c) # False - objetos de lista diferentes
print(a == c) # True - valores iguaisArmadilhas
- Surpresas com cópia superficial -
list.copy()ecopy.copy()ainda compartilham mutáveis aninhados. Correção:deepcopyquando o aninhamento é importante. - Argumentos mutáveis padrão -
def f(items=[])reutiliza uma lista. Correção:def f(items=None): items = items or []. - Revinculação vs mutação -
x = x + [1]cria uma nova lista;x.append(1)muta no local. Correção: Saiba qual operação você pretende. - Dicas de tipo não são verificações em tempo de execução - mypy pega erros antes da implantação; o próprio Python ignora as dicas. Correção: Use Pydantic ou
isinstanceexplícito nas fronteiras. isvs==para inteiros/strings pequenos - CPython pode internar alguns literais, mas nunca confie emispara comparação de valores. Correção: Use==para valores,isapenas para verificações do singletonNone.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
dataclasses com campos tipados | Registros estruturados com dicas | Variáveis de script simples |
| Modelos Pydantic | Validação em tempo de execução nas bordas da API | Código numérico de loop interno |
TypedDict | Dicionários em forma de JSON com estrutura estática | Objetos que precisam de métodos |
NamedTuple | Registros leves e imutáveis | Necessidade de mutabilidade |
FAQs
Python tem variáveis ou referências?
Ambos os termos aparecem na documentação. Na prática: nomes se vinculam a referências de objetos. Não existem variáveis estilo C que armazenam valores brutos na pilha para objetos arbitrários.
Por que mudar uma lista através de uma variável afeta outra?
Ambos os nomes referenciam o mesmo objeto de lista. A atribuição nunca clona, a menos que você copie explicitamente.
As dicas de tipo são impostas em tempo de execução?
Não. Use mypy, pyright ou Pydantic quando precisar de imposição. As dicas são armazenadas em __annotations__ mas ignoradas pelo interpretador.
Qual a diferença entre type() e isinstance()?
type(x) is int falha para subclasses. Prefira isinstance(x, int) para verificações polimórficas.
Uma função pode mudar a variável de um chamador?
Somente se você mutar um objeto mutável compartilhado. Revincular um nome de parâmetro não afeta o nome do chamador.
O que a imutabilidade me proporciona?
Objetos imutáveis são hashable (quando seus conteúdos são hashable) e seguros como chaves de dicionário. Eles também evitam mutação acidental no local através de aliases.
Como copio uma estrutura aninhada?
from copy import deepcopy
clone = deepcopy(nested)Por que usar id()?
Depuração de problemas de identidade - confirmando se dois nomes apontam para o mesmo objeto durante a solução de problemas.
x = x + 1 cria um novo int?
Sim. Inteiros pequenos podem ser cacheados, mas semanticamente += em imutáveis revincula o nome a um novo objeto.
Quando devo adicionar dicas de tipo a variáveis?
Quando o tipo não é óbvio pela atribuição, ou quando mypy precisa de ajuda para estreitar uniões.
Relacionados
- Números, Booleanos e Aritmética - tipos numéricos e veracidade
- Funções, Args e Escopo - vinculação de parâmetros e escopo
- Imutabilidade e Hashability - chaves hashable
- Noções Básicas de Dicas de Tipo - anotando nomes e funções
Versões da Pilha: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.