CodeGym /Curso Java /Python SELF PT /Escopos de variáveis

Escopos de variáveis

Python SELF PT
Nível 6 , Lição 4
Disponível

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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION