Módulo 3 - Funções avançadas

Escopo local e global

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Diferenciar variável local de variável global.
  • Entender que atribuir dentro de uma função cria uma variável local.
  • Saber quando (e por que evitar) o comando global.
  • Conhecer a regra LEGB de busca de nomes em uma visão simples.

Variável local e variável global

Toda variável nasce em um lugar, e esse lugar define onde ela pode ser usada. Uma variável criada dentro de uma função vive apenas durante a execução daquela função: quando a função termina, a variável some. Ela é local. Já uma variável definida no nível do arquivo, fora de qualquer função, é global e pode ser lida de qualquer ponto do módulo. Essa separação é ótima: cada função tem o seu espaço próprio, e o que acontece dentro dela não bagunça o resto do programa.

taxa = 0.1  # global, definida no nivel do arquivo

def aplicar(valor):
    desconto = valor * taxa  # le a global taxa; desconto e local
    return valor - desconto

print(aplicar(100))  # 90.0
print(desconto)      # NameError: name 'desconto' is not defined
# desconto so existia dentro de aplicar; aqui fora, nao existe.

aplicar lê a global taxa, mas desconto é local e não existe fora da função.

No exemplo, taxa é global e a função consegue lê-la sem cerimônia. Já desconto nasceu dentro de aplicar, então é local: tentar usá-la fora dá NameError, porque ela deixou de existir quando a função retornou. Esse comportamento é uma proteção, não um obstáculo. Ele garante que uma variável temporária de uma função não colida com outra de mesmo nome em outra função. Sem escopo, programas grandes virariam um campo minado de nomes se atropelando.

Atribuir dentro da função cria uma local

Aqui mora uma confusão comum. Ler uma global dentro da função funciona direto. Mas, no momento em que você atribui a um nome dentro da função, o Python passa a considerar esse nome local, mesmo que exista uma global com o mesmo nome. Isso pode gerar um erro que assusta quem não conhece a regra: a função parece usar a global antes de defini-la, e o Python reclama.

contador = 0

# Errado: atribuir torna contador local, e ai a leitura falha
def incrementar():
    contador = contador + 1  # local no lado esquerdo, mas usado antes
    return contador

incrementar()
# UnboundLocalError: cannot access local variable 'contador'
# O Python viu a atribuicao e tratou contador como local o tempo todo.

A atribuição torna contador local; usá-lo antes de definir dá UnboundLocalError.

Para de fato reatribuir a global de dentro da função, existe o comando global. Ele avisa ao Python que aquele nome se refere à variável global, não a uma nova local. Funciona, mas use com muita parcimônia. Mexer em variáveis globais de dentro de funções deixa o programa difícil de acompanhar, porque qualquer função pode alterar o estado compartilhado sem deixar rastro na sua assinatura. O caminho mais limpo quase sempre é receber o valor por parâmetro e devolver o novo valor com return.

contador = 0

def incrementar():
    global contador       # avisa: contador aqui e a global
    contador = contador + 1
    return contador

print(incrementar())  # 1
print(incrementar())  # 2

# Melhor design: sem global, valor entra e sai
def proximo(n):
    return n + 1
contador = proximo(contador)  # 3

global resolve, mas passar o valor e devolver com return costuma ser mais limpo.

A regra LEGB, em visão simples

Quando você usa um nome, como print ou taxa, o Python precisa descobrir a qual variável ele se refere. Ele procura em uma ordem fixa, resumida na sigla LEGB. Primeiro no escopo Local, dentro da função atual. Se não achar, sobe para o Enclosing, o escopo de uma função que envolve a atual (útil em funções dentro de funções). Depois no Global, o nível do arquivo. Por fim no Built-in, o conjunto de nomes que já vêm com o Python, como print, len e range. O primeiro que ele encontrar nessa sequência é o que vale.

LetraEscopoExemplo
LLocal, a função atualuma variável criada dentro da função
EEnclosing, função que envolvevariável da função de fora, em funções aninhadas
GGlobal, o módulotaxa definida no nível do arquivo
BBuilt-in, nomes embutidosprint, len, range, sum

A ordem de busca de nomes no Python: para no primeiro que encontrar.

Você não precisa decorar LEGB para programar bem, mas conhecer a ordem explica muitos comportamentos. Por exemplo, por que uma variável local com o mesmo nome de uma global sombreia a global dentro da função: o Python acha a local primeiro e nem chega na global. Ou por que dá para chamar print em qualquer lugar: ele mora no escopo Built-in, o último e mais amplo. Entender a busca de nomes tira o mistério de erros como o UnboundLocalError que você acabou de ver.

Teste rápido

Uma variável criada dentro de uma função, sem usar global, pode ser lida fora dela?

Perguntas frequentes

Consigo ler uma variável global dentro de uma função sem declarar nada?
Sim. Ler uma global de dentro de uma função funciona direto, sem o comando global. Ele só é necessário quando você quer reatribuir a global, ou seja, colocá-la do lado esquerdo de um igual. Enquanto você apenas lê o valor, o Python encontra a global pela regra LEGB.
O que causa o UnboundLocalError?
Ele aparece quando você atribui a um nome dentro da função e também tenta lê-lo antes dessa atribuição. Como a atribuição torna o nome local para toda a função, a leitura anterior não encontra valor nenhum. A correção é usar global (se realmente precisa da global) ou, melhor, passar o valor por parâmetro.
Usar global é sempre errado?
Não é proibido, mas costuma ser um sinal de design que dá para melhorar. Variáveis globais alteradas por várias funções tornam o fluxo difícil de seguir e de testar. Prefira receber valores por parâmetro e devolvê-los com return. Reserve global para casos raros, como um contador simples em um script pequeno.
O que é o E de LEGB, o escopo enclosing?
É o escopo de uma função que envolve outra. Quando você define uma função dentro de outra, a de dentro pode ler variáveis da de fora: esse é o escopo enclosing. É a base dos closures, um tema mais avançado. No começo, basta saber que ele fica entre o local e o global na ordem de busca.
Duas funções podem ter variáveis locais com o mesmo nome?
Podem, sem conflito nenhum. Cada função tem o seu próprio escopo local, então uma variável total dentro de uma função é totalmente independente de outra total em outra função. Esse isolamento é justamente o que torna funções seguras de reaproveitar em programas grandes.
Existe um comando parecido com global para funções aninhadas?
Existe, o comando nonlocal. Ele permite reatribuir uma variável do escopo enclosing, a função de fora, a partir da função de dentro. É um recurso mais avançado, usado em closures. Assim como global, deve ser usado com moderação, porque também mexe em estado fora do escopo local.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.