Resumo : neste tutorial, você aprenderá sobre os escopos não locais do Python e como usar a nonlocal
palavra-chave para alterar as variáveis dos escopos não locais.
Introdução aos escopos não locais do Python
Em Python, você pode definir uma função dentro de outra função. Por exemplo:
def outer():
print('outer function')
def inner():
print('inner function')
inner()
outer()
Linguagem de código: Python ( python )
Saída:
outer function
inner function
Linguagem de código: JavaScript ( javascript )
Neste exemplo, definimos uma função chamada outer
.
Dentro da outer
função, definimos outra função chamada inner
. E chamamos a inner
função de dentro da outer
função.
Freqüentemente, dizemos que a inner
função está aninhada na outer
função. Na prática, você define funções aninhadas quando não deseja que essas funções sejam globais.
Ambos outer
e inner
têm acesso aos escopos globais e integrados , bem como aos seus escopos locais.
E a inner
função também tem acesso ao seu escopo envolvente, que é o escopo da outer
função.
Do inner()
ponto de vista da função, o seu âmbito envolvente não é local nem global. E o Python chama isso de escopo não local.
Vamos modificar as funções outer
e inner
:
def outer():
message = 'outer function'
print(message)
def inner():
print(message)
inner()
outer()
Linguagem de código: Python ( python )
Saída:
outer function
outer function
Linguagem de código: JavaScript ( javascript )
Quando chamamos a outer
função, Python cria a inner
função e a executa.
Quando a inner
função é executada, o Python não encontra a message
variável no escopo local. Portanto, o Python procura isso no escopo anexo, que é o escopo da outer
função:
Veja o exemplo a seguir:
message = 'global scope'
def outer():
def inner():
print(message)
inner()
outer()
Linguagem de código: Python ( python )
Saída:
global scope
Linguagem de código: PHP ( php )
Neste exemplo, Python procura a message
variável no escopo local da inner
função.
Como o Python não encontra a variável, ele procura a variável em seu escopo envolvente, que é o escopo da outer
função.
E neste caso, o Python sobe ao escopo global para encontrar a variável:
Palavra-chave não local do Python
Para modificar variáveis de um escopo não local em um escopo local, você usa a nonlocal
palavra-chave. Por exemplo:
def outer():
message = 'outer scope'
print(message)
def inner():
nonlocal message
message = 'inner scope'
print(message)
inner()
print(message)
outer()
Linguagem de código: Python ( python )
Saída:
outer scope
inner scope
inner scope
Neste exemplo, usamos nonlocal
palavra-chave para instruir explicitamente o Python que estamos modificando uma variável não local.
Quando você usa a nonlocal
palavra-chave para uma variável, o Python procurará a variável na cadeia de escopos locais até encontrar pela primeira vez o nome da variável.
Mais importante ainda, o Python não procurará a variável no escopo global.
Considere o seguinte exemplo:
message = 'outer scope'
def outer():
print(message)
def inner():
nonlocal message
message = 'inner scope'
print(message)
inner()
print(message)
outer()
Linguagem de código: Python ( python )
Se você executar este código, receberá o seguinte erro:
SyntaxError: no binding for nonlocal 'message' found
Linguagem de código: JavaScript ( javascript )
De dentro da inner
função, usamos a nonlocal
palavra-chave da message
variável.
Portanto, Python procura a message
variável no escopo envolvente, que é o escopo da outer
função.
Como o escopo da outer
função não possui message
variável e o Python não procura mais no escopo global, ele gera um erro:
Resumo
- Os escopos envolventes das funções internas são chamados de escopos não locais.
- Use a
nonlocal
palavra-chave para modificar a variável dos escopos não locais. - E o Python procurará as variáveis não locais na cadeia de escopos locais envolvente. Não procurará a variável no escopo global.