Gerir o âmbito das variáveis

Concluído

Tip

Consulte a guia Texto e imagens para obter mais detalhes!

Scope é a região do teu código onde existe uma variável e pode ser usada. Compreender o âmbito ajuda-te a escrever funções que não interfiram acidentalmente umas com as outras — e ajuda a evitar toda uma classe de bugs confusos.

Variáveis locais

Uma variável criada dentro de uma função é uma variável local. Só existe enquanto a função está a correr e não pode ser vista de fora da função.

def calculate_total(price, tax):
    total = price + tax     # `total` is local to this function
    return total

calculate_total(10, 2)
print(total)                # NameError: name 'total' is not defined

Cada chamada a uma função tem o seu próprio conjunto de variáveis locais, por isso as funções não sobrescrevem acidentalmente os dados umas das outras.

Variáveis globais

Uma variável criada fora de qualquer função é uma variável global. As funções conseguem ler variáveis globais, mas por defeito não as podem alterar .

message = "Hello"

def greet():
    print(message)   # Reading a global variable is fine

greet()              # Output: Hello

Se tentar atribuir um novo valor a uma variável que também existe globalmente, o Python trata-a como uma nova variável local — o valor do global é deixado intacto.

color = "blue"

def change_color():
    color = "red"   # This creates a new local variable, not the global one

change_color()
print(color)        # Output: blue

A global palavra-chave (usar com moderação)

Se realmente precisar de alterar uma variável global a partir de dentro de uma função, pode declará-la com a global palavra-chave:

count = 0

def increment():
    global count
    count = count + 1

increment()
print(count)   # Output: 1

No entanto, modificar os globais a partir de funções internas torna o código mais difícil de seguir e mais difícil de testar. Um padrão melhor é passar o valor como um parâmetro e devolver o valor atualizado:

def increment(count):
    return count + 1

count = 0
count = increment(count)
print(count)   # Output: 1

Porque é que o âmbito é importante

  • As variáveis locais mantêm as funções independentes — uma variável numa função não pode prejudicar outra.
  • Não há problema em aceder a variáveis globais quando se trata de constantes, como os valores de configuração.
  • Escrever em variáveis globais dentro de funções é uma fonte comum de bugs difíceis de detetar. Prefira parâmetros e valores de retorno.