10.1 Variáveis locais de funções
Em Python, uma variável está disponível (pode ser acessada) desde o momento em que é criada até o final do seu escopo — na maioria das vezes, é a função em que foi declarada. Se uma variável for declarada fora de todas as funções, ela é chamada de global.
Em Python, os escopos de variáveis determinam o contexto no qual as variáveis estão disponíveis para uso. Os escopos ajudam a evitar conflitos de nomes e a gerenciar o acesso aos dados. Os principais tipos de escopos em Python incluem:
Escopo local: Variáveis criadas dentro de uma função existem no escopo local dessa função e estão disponíveis apenas dentro dela.
Escopo de funções aninhadas: Se uma função está definida dentro de outra função, suas variáveis estão disponíveis apenas dentro dessa função aninhada.
Escopo global: Variáveis definidas no nível do script ou módulo são consideradas globais e estão disponíveis em qualquer parte do código no mesmo módulo.
Escopo embutido: Este é um escopo especial que inclui todos os objetos e funções embutidos do Python, disponíveis por padrão (por exemplo, print() e len()).
Regra LEGB
Para resolver variáveis, Python usa a regra LEGB, que determina a ordem em que o intérprete procura as variáveis:
- L (Local) — Primeiro, busca no escopo local.
- E (Enclosed) — Depois nos escopos de todas as funções aninhadas, da mais próxima à mais externa.
- G (Global) — Em seguida, no escopo global.
- B (Built-in) — Finalmente, no escopo embutido.
Exemplos de uso
x = "global" # Variável global
def outer():
y = "outer local" # Variável local da função externa
def inner():
z = "inner local" # Variável local da função aninhada
print(x) # Imprime "global"
print(y) # Imprime "outer local"
print(z) # Imprime "inner local"
inner()
outer()
A variável z
está disponível apenas dentro da função inner()
.
A variável y
está disponível dentro da função outer()
e em todas as funções declaradas dentro dela.
A variável x
está disponível em qualquer lugar no arquivo atual (módulo).
10.2 Acesso a variáveis globais: global x
Uma característica interessante do Python é que variáveis de escopos externos (nos quais o escopo atual está aninhado) só podem ser lidas.
Ao tentar atribuir algo a uma variável externa, será criada uma variável local com o mesmo nome, e o acesso à variável externa será perdido.
Exemplo:
x = 10
def change_global():
print(x) # Isso causará um erro, já que x será considerado uma variável local após a atribuição
x = 20 # Aqui será criada uma variável local x
print(x) # Imprimirá 20 (estamos acessando a variável local x)
change_global()
print(x) # Imprimirá 10
Este exemplo não funciona e gerará um erro UnboundLocalError
, porque o intérprete Python primeiro vê a atribuição x = 20
e considera que x
é uma variável local. No entanto, quando o intérprete chega na linha print(x)
, ele não encontra a variável local x
, pois ela ainda não foi definida.
Isso é feito por segurança, para que variáveis locais não modifiquem acidentalmente as globais.
Operador global
Se você precisa conscientemente modificar o valor de uma variável global dentro de uma função, pode usar o operador global
. Este operador permite especificar explicitamente que a modificação deve ocorrer na variável global, e não na local.
Para alterar o valor de uma variável global dentro de uma função, você deve declarar essa variável no início da função com global
. Isso dá à função acesso para modificar a variável:
x = 10
def change_global():
global x # Declaramos x como uma variável global
print(x) # Imprimirá 10 (estamos acessando a variável global x)
x = 20 # Aqui atribuímos um novo valor à variável global x
print(x) # Imprimirá 20 (estamos acessando a variável global x)
change_global()
print(x) # Imprimirá 20
O uso do operador global
evita erros e gerencia corretamente variáveis globais.
Variáveis globais podem tornar o programa menos previsível e mais difícil de entender, já que seus valores podem ser alterados em qualquer lugar do programa. Isso é especialmente crítico se o programa for grande e desenvolvido por uma equipe de programadores.
Ainda que, às vezes, o uso de variáveis globais seja inevitável, é melhor tentar minimizar seu uso. Em vez de variáveis globais, considere usar parâmetros de função, valores de retorno e classes para armazenar estado.
Usar variáveis globais pode levar a efeitos colaterais inesperados, dificultar a depuração e o teste do código, além de reduzir sua reutilização. Portanto, recomenda-se usar variáveis globais com cautela e apenas quando for realmente necessário.
10.3 Acesso a variáveis não-locais: nonlocal
Além de variáveis globais e locais, em Python existem variáveis de escopos intermediários. Por exemplo, quando uma função está aninhada em outra função. Para trabalhar com essas variáveis, usa-se o operador nonlocal
.
O operador nonlocal
permite trabalhar com variáveis em funções aninhadas, alterando seus valores no escopo mais próximo, excluindo variáveis globais.
O operador nonlocal
ajuda a evitar a criação de uma nova variável local na função aninhada quando é necessário modificar uma variável definida na função externa. Sem o uso de nonlocal
, as alterações afetarão apenas a variável local da função interna, sem influenciar a variável na função externa.
Exemplo:
def outer():
count = 0
def inner():
nonlocal count
count += 1
return count
return inner
counter = outer()
print(counter()) # Imprimirá 1
Aqui está um exemplo mais prático do uso de nonlocal
para criar um contador:
def create_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter = create_counter()
print(counter()) # Imprimirá 1
print(counter()) # Imprimirá 2
print(counter()) # Imprimirá 3
Este exemplo demonstra como nonlocal
pode ser usado em cenários reais para criar uma função que mantém seu estado entre as chamadas.
GO TO FULL VERSION