Escopo de Variáveis - Python
O escopo de uma variável define o contexto em que ela pode ser utilizada. No Python, existem dois tipos principais de escopo: global e local.
Escopo global
O escopo global indica que uma variável é global, ou seja, ela é definida fora de qualquer função e está acessível a todas as funções do programa. Por exemplo:
name = "Tom"
def say_hi():
print("Hello", name)
def say_bye():
print("Goodbye", name)
say_hi()
say_bye()
Aqui, a variável name
Escopo local
Ao contrário das variáveis globais, uma variável local é definida dentro de uma função e só pode ser acessada por essa função, tendo, portanto, um escopo local:
def say_hi():
name = "Sam"
surname = "Johnson"
print("Hello", name, surname)
def say_bye():
name = "Tom"
print("Goodbye", name)
say_hi() # Hello Sam Johnson
say_bye() # Goodbye Tom
Nesse exemplo, em cada uma das funções é definida uma variável local name
say_hi()
surname
say_bye()
Ocultando Variáveis Globais
name = "Tom"
def say_hi():
name = "Bob" # oculta a variável global
print("Hello", name)
def say_bye():
print("Goodbye", name)
say_hi() # Hello Bob
say_bye() # Goodbye Tom
name = "Tom"
def say_hi():
name = "Bob" # oculta a variável global
print("Hello", name)
def say_bye():
print("Goodbye", name)
say_hi() # Hello Bob
say_bye() # Goodbye Tom
Neste caso, a variável global name
say_hi()
say_bye()
say_hi()
Se desejarmos alterar a variável global dentro de uma função, em vez de definir uma nova variável local, precisamos usar a palavra-chave global
name = "Tom"
def say_hi():
global name
name = "Bob" # altera o valor da variável global
print("Hello", name)
def say_bye():
print("Goodbye", name)
say_hi() # Hello Bob
say_bye() # Goodbye Bob
nonlocal
A palavra-chave nonlocal
nonlocal
def outer(): # função externa
n = 5
def inner(): # função interna
print(n)
inner() # 5
print(n)
outer() # 5
Aqui, a função interna inner()
outer()
outer()
inner()
Agora, vejamos o que acontece quando a função interna atribui um novo valor à variável n
def outer(): # função externa
n = 5
def inner(): # função interna
n = 25
print(n)
inner() # 25
print(n)
outer() # 25 - inner
# 5 - outer
Quando a função interna faz a atribuição n = 25
n
n
outer()
Para indicar que a função interna deve usar a variável da função externa, utilizamos a palavra-chave nonlocal
def outer(): # função externa
n = 5
def inner(): # função interna
nonlocal n # indica que n é a variável da função externa
n = 25
print(n)
inner() # 25
print(n)
outer() # 25
Com o uso de nonlocal
n