Voltar ao Glossario
Glossario Python

Variavel: O que É e Como Funciona | Python Brasil

Entenda variaveis em Python: criacao, tipos, escopo, convencoes de nomenclatura, tipagem dinamica e boas praticas para gerenciar dados no seu codigo.

O que e uma Variavel?

Uma variavel em Python e um nome que faz referencia a um objeto na memoria. Diferente de linguagens como C ou Java, onde variaveis sao “caixas” que armazenam valores, em Python variaveis sao rotulos (labels) que apontam para objetos. Essa distincao e fundamental para entender o comportamento da linguagem, especialmente quando se trabalha com objetos mutaveis.

Python utiliza tipagem dinamica, o que significa que voce nao precisa declarar o tipo de uma variavel — o tipo e determinado automaticamente pelo valor atribuido e pode mudar ao longo da execucao do programa.

Como Criar Variaveis

# Atribuicao simples
nome = 'Maria'
idade = 30
altura = 1.68
ativo = True

# Atribuicao multipla
x, y, z = 1, 2, 3
a = b = c = 0

# Troca de valores (Pythonic)
x, y = y, x  # troca x e y sem variavel temporaria

# Desempacotamento
primeiro, *meio, ultimo = [1, 2, 3, 4, 5]
print(primeiro)  # 1
print(meio)      # [2, 3, 4]
print(ultimo)    # 5

Tipagem Dinamica

Em Python, o tipo pertence ao objeto, nao a variavel. A mesma variavel pode referenciar objetos de tipos diferentes ao longo do programa.

valor = 42          # int
print(type(valor))  # <class 'int'>

valor = 'Python'    # agora e str
print(type(valor))  # <class 'str'>

valor = [1, 2, 3]   # agora e list
print(type(valor))  # <class 'list'>

# Verificando tipos
x = 3.14
print(isinstance(x, float))        # True
print(isinstance(x, (int, float))) # True — aceita tupla de tipos

Convencoes de Nomenclatura

O PEP 8, guia de estilo oficial do Python, define convencoes claras para nomes de variaveis.

# Variaveis e funcoes: snake_case
nome_completo = 'Ana Silva'
total_de_itens = 42
taxa_de_juros = 0.05

# Constantes: UPPER_SNAKE_CASE
PI = 3.14159265
MAX_CONEXOES = 100
URL_BASE = 'https://api.exemplo.com'

# Classes: PascalCase
# class MinhaClasse:

# Variaveis "privadas": prefixo com underscore
_variavel_interna = 'uso interno'
__variavel_name_mangling = 'name mangling ativo'

# Variavel descartavel
for _ in range(5):
    print('repetindo')

# Nomes reservados — evitar conflito com builtins
lista_ = [1, 2, 3]   # underscore no final para evitar conflito com list
tipo_ = 'exemplo'     # evita conflito com type

Escopo de Variaveis

O escopo define onde uma variavel pode ser acessada. Python segue a regra LEGB.

# Escopo global
mensagem_global = 'Sou global'

def exemplo_escopo():
    # Escopo local
    mensagem_local = 'Sou local'
    print(mensagem_global)  # acessa variavel global
    print(mensagem_local)   # acessa variavel local

exemplo_escopo()
# print(mensagem_local)  # NameError! Nao existe fora da funcao

# Palavra-chave global
contador = 0

def incrementar():
    global contador
    contador += 1

incrementar()
incrementar()
print(contador)  # 2

# Palavra-chave nonlocal
def externa():
    valor = 10

    def interna():
        nonlocal valor
        valor += 5

    interna()
    return valor

print(externa())  # 15

Referencia vs Valor

Em Python, variaveis sempre guardam referencias a objetos. Para tipos imutaveis, o efeito pratico e semelhante a passagem por valor. Para tipos mutaveis, e essencial entender as implicacoes.

# Com imutaveis — comportamento "seguro"
a = 10
b = a
b += 5
print(a)  # 10 — a nao foi afetado

# Com mutaveis — cuidado!
lista_a = [1, 2, 3]
lista_b = lista_a       # ambas apontam para o MESMO objeto
lista_b.append(4)
print(lista_a)           # [1, 2, 3, 4] — lista_a tambem mudou!

# Para criar uma copia independente
lista_c = lista_a.copy()
lista_c.append(5)
print(lista_a)           # [1, 2, 3, 4] — lista_a nao foi afetada

# Verificando identidade
print(lista_a is lista_b)   # True — mesmo objeto
print(lista_a is lista_c)   # False — objetos diferentes
print(lista_a == lista_c[:4])  # True — mesmo conteudo

Anotacoes de Tipo

Embora a tipagem seja dinamica, o Python permite anotacoes de tipo para documentacao e ferramentas de analise estatica.

# Anotacoes de tipo (nao alteram o comportamento em runtime)
nome: str = 'Ana'
idade: int = 28
notas: list[float] = [9.5, 8.0, 7.5]
config: dict[str, str] = {'host': 'localhost', 'porta': '8080'}

# Tipos opcionais
from typing import Optional
resultado: Optional[str] = None  # pode ser str ou None

# A partir do Python 3.10
def buscar(id: int) -> str | None:
    pass

Variaveis de Ambiente

Para configuracoes sensiveis como senhas e chaves de API, utilize variaveis de ambiente.

import os

# Lendo variaveis de ambiente
database_url = os.environ.get('DATABASE_URL', 'sqlite:///local.db')
debug = os.environ.get('DEBUG', 'False').lower() == 'true'
api_key = os.getenv('API_KEY')  # retorna None se nao existir

# Com python-dotenv para carregar de arquivo .env
# pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()
secret = os.getenv('SECRET_KEY')

Erros Comuns

O erro mais comum e assumir que atribuicao cria uma copia, quando na verdade cria uma referencia ao mesmo objeto — particularmente perigoso com listas e dicionarios. Outro erro frequente e usar nomes de variaveis que conflitam com builtins do Python, como list, dict, type ou id, o que sobrescreve a funcao original. Tambem e comum referenciar uma variavel antes de atribui-la, especialmente dentro de funcoes onde o Python interpreta a variavel como local se houver atribuicao em qualquer ponto da funcao.

Boas Praticas

Use nomes descritivos que revelem a intencao: quantidade_de_alunos e muito melhor que qa. Siga as convencoes do PEP 8 consistentemente. Evite variaveis globais — elas dificultam testes e tornam o fluxo do programa imprevisivel. Use anotacoes de tipo para melhorar a legibilidade e permitir verificacao estatica com ferramentas como mypy. Nunca armazene segredos diretamente no codigo — use variaveis de ambiente ou gerenciadores de segredos.

Quando Usar

Variaveis sao o mecanismo fundamental para armazenar e manipular dados em qualquer programa Python. Entender como funcionam referencias, escopo e tipagem dinamica e essencial para evitar bugs sutis e escrever codigo robusto.