Escopo e variáveis locais

Entender onde nomes são acessíveis e reduzir dependência de estado global.

Escopo e variáveis locais

Objetivo da aula

Entender onde nomes são acessíveis e reduzir dependência de estado global.

Regra desta aula: vamos assumir que você nunca viu este assunto antes. Nenhum termo importante será usado sem explicação e todo exemplo deve ser entendido linha por linha, não apenas copiado.

Começando do zero

Escopo determina onde um nome pode ser acessado. Variáveis criadas dentro de uma função são normalmente locais àquela chamada. Isso ajuda a manter responsabilidades separadas e evita que qualquer parte do programa altere qualquer valor sem controle.

Uma imagem mental para entender

Imagine salas com quadros brancos próprios. Uma anotação feita no quadro da sala A não aparece automaticamente no quadro da sala B. Variáveis locais funcionam como essas anotações: pertencem ao contexto da função. Existem mecanismos para acessar estado global, mas o uso indiscriminado cria dependências difíceis de acompanhar.

Conceitos essenciais, sem pular etapas

Variável local

Um nome atribuído dentro de uma função é, em regra, local àquela função. Ele é criado para a execução da chamada e não deve ser tratado como um nome disponível em todo o programa.

Parâmetros são locais

Os parâmetros recebem argumentos e existem dentro do escopo da função.

Nome global

Um nome definido no nível do módulo pode ser lido de dentro de funções em certos contextos, mas depender de globais mutáveis torna a função menos previsível.

Sombreamento

Uma variável local pode ter o mesmo nome de uma global e “esconder” aquela associação dentro do escopo local. Isso é legal, mas pode confundir.

Preferência didática

Neste nível, prefira passar dados por parâmetros e devolver resultados com return em vez de modificar variáveis globais.

Modelo mental

ARGUMENTOS → PARÂMETROS LOCAIS → VARIÁVEIS LOCAIS → return → VALOR FORA DA FUNÇÃO

Exemplo 1 — primeiro veja o programa inteiro

taxa = 0.10

def calcular_desconto(preco):
    valor_desconto = preco * taxa
    return valor_desconto

desconto = calcular_desconto(100)
print(desconto)

Agora vamos ler linha por linha

  • taxa está no nível do módulo e é lida pela função.
  • preco é parâmetro local.
  • valor_desconto é criado dentro da função e não existe como nome local fora dela.
  • Para código mais independente, a taxa também poderia ser parâmetro, deixando todas as dependências explícitas.

Saída esperada

10.0

Exemplo 2 — o mesmo conceito em outra situação

def calcular_desconto(preco, taxa):
    valor_desconto = preco * taxa
    return valor_desconto

print(calcular_desconto(100, 0.10))

Esta versão recebe todas as informações necessárias pela assinatura. Ela é mais fácil de testar com taxas diferentes e depende menos de estado externo.

Experimento guiado

Não pule esta parte. Programação só começa a fazer sentido quando você prevê um resultado, executa e compara a previsão com o que realmente aconteceu.

  1. Tente acessar uma variável local fora da função e observe o erro.
  2. Converta uma dependência global simples em parâmetro.
  3. Crie duas chamadas com argumentos diferentes e confirme que os valores locais não “vazam” de uma chamada para outra.
  4. Evite global neste módulo; primeiro aprenda a projetar funções com entradas e saídas explícitas.

Mini desafio

Crie uma função calcular_area(largura, altura) que use uma variável local area e retorne o resultado.

Solução comentada

def calcular_area(largura, altura):
    area = largura * altura
    return area

resultado = calcular_area(4, 3)
print(resultado)

Depois de executar a solução, altere pelo menos um valor e explique por que o novo resultado mudou. Se você só copiou e não consegue explicar cada linha, refaça o desafio em uma versão menor.

Erros comuns e por que acontecem

  • Esperar usar fora da função uma variável que só foi criada localmente.
  • Usar variáveis globais mutáveis para tudo e tornar a ordem das chamadas importante demais.
  • Reutilizar o mesmo nome em escopos diferentes sem necessidade e confundir a leitura.
  • Pensar em escopo como “segurança absoluta”; ele é uma regra de resolução de nomes, não um mecanismo completo de proteção de dados.

Cheque se você realmente entendeu

Parâmetros pertencem a qual escopo?

Resposta: Ao escopo local da função durante a chamada.

Por que passar dados por parâmetros ajuda?

Resposta: Porque deixa dependências explícitas e facilita testes e reutilização.

Uma variável local deve ser acessível fora da função pelo mesmo nome?

Resposta: Não, normalmente não.

Resumo em linguagem simples

Nesta aula, o ponto central foi Escopo e variáveis locais. Tente explicar o modelo ARGUMENTOS → PARÂMETROS LOCAIS → VARIÁVEIS LOCAIS → return → VALOR FORA DA FUNÇÃO sem olhar a tela. Depois, escreva um exemplo próprio menor que os apresentados. Esse exercício de explicação é parte do aprendizado, não um extra.

Conexão com a próxima aula

Na próxima aula, Decomposição, contratos e docstrings, vamos aproveitar exatamente o que foi construído aqui. Você não precisa memorizar tudo; precisa conseguir reconhecer o conceito e reconstruí-lo com raciocínio e testes.