Neste tutorial, vamos nos atualizar primeiro sobre os escopos de variáveis, para que possamos entender corretamente como funcionam as variáveis globais, locais e não locais do Python.

Variáveis locais

Exemplo:


 

x = "exterior"

 

def interno():

    # Essa é a variável local!

    x = "interno"

   

    return x

 

print("exterior:", x)

print("interno:", interno())

 


Saída —--------------------

exterior: exterior

interno: interno


Observe como a reatribuição do x interno não altera o x externo.

Como você pode ver, as variáveis declaradas dentro de uma função (e outros tipos de escopos, como classes e métodos de classe), são locais ao seu escopo. Em outras palavras, eles não interagem com nada fora do escopo!


Aqui está mais um exemplo:


 

x = "exterior"

 

def interno():

    x = "interno"

   

    def mesmo_interior():

        # x é local para inner(), que engloba mesmo_interior()

        # então isso funciona

        print("mesmo_interior:", x)

       

        # x = 10 <-- Isso irá quebrá-lo,

        # já que x se torna local para even_inner

        # # O que fará com que a instrução anterior

        # seja interrompida, pois o x interno é desatribuído

        # # dentro de even_inner

       

        return x # Observe que isso ainda funciona!

   

    return mesmo_interior()

 

print("exterior:", x)

print("interno:", interno())

 

 


Python global e nonlocal (não local)


Existe uma maneira de controlar em quais variáveis de escopo se enquadram. Dessa forma, você pode ter variáveis que seriam locais afetando a variável global (ou uma variável do escopo pai)!

Use as palavras-chave global e nonlocal .


global


 

x = "não afetado"

 

def interno():

    # Isso define todas as atribuições para o nome 'x'

    # para serem iguais às atribuições

    # para o x global

    global x

   

    x = "afetado"

   

   

print("antes do interior:", x)

interno()

print("após interior:", x)

 


nonlocal

nonlocal é algo semelhante, mas diferente.

Onde global permite atribuir variáveis no escopo global. nonlocal, em vez disso, permite que você vá 'apenas um passo'. Permitindo que você altere variáveis locais locais para um escopo pai em vez do escopo global! É uma boa maneira de encapsular variáveis e evitar que as coisas 'se espalhem', por assim dizer.


É melhor ilustrado com um exemplo:


 

x = "global"

 

def interior():

    x = "interior" # Isso configura uma variável local para internal

    print("antes de mesmo_interior:", x) # Verificamos aqui

   

    def mesmo_interior():

        nonlocal x # Agora podemos reatribuir o x que é local para interno!

        x = "mesmo_interior" # O que fazemos aqui

   

    mesmo_interior() # Isso define "interior" -> "mesmo_interior"

   

    return x # E retorna "mesmo_interior"

   

print("global:", x)

print("depois mesmo_interior:", interior())

print("global preservado:", x)