Python não local

Resumo : neste tutorial, você aprenderá sobre os escopos não locais do Python e como usar a nonlocalpalavra-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 functionLinguagem de código:  JavaScript  ( javascript )

Neste exemplo, definimos uma função chamada outer.

Dentro da outerfunção, definimos outra função chamada inner. E chamamos a innerfunção de dentro da outerfunção.

Freqüentemente, dizemos que a innerfunção está aninhada na outerfunção. Na prática, você define funções aninhadas quando não deseja que essas funções sejam globais.

Ambos outere innertêm acesso aos escopos globais e integrados , bem como aos seus escopos locais.

E a innerfunção também tem acesso ao seu escopo envolvente, que é o escopo da outerfunçã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 outere 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 functionLinguagem de código:  JavaScript  ( javascript )

Quando chamamos a outerfunção, Python cria a innerfunção e a executa.

Quando a innerfunção é executada, o Python não encontra a messagevariável no escopo local. Portanto, o Python procura isso no escopo anexo, que é o escopo da outerfunçã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 scopeLinguagem de código:  PHP  ( php )

Neste exemplo, Python procura a messagevariável no escopo local da innerfunção.

Como o Python não encontra a variável, ele procura a variável em seu escopo envolvente, que é o escopo da outerfunção.

E neste caso, o Python sobe ao escopo global para encontrar a variável:

Escopos não locais do Python - pesquisa de variáveis

Palavra-chave não local do Python

Para modificar variáveis ​​de um escopo não local em um escopo local, você usa a nonlocalpalavra-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 nonlocalpalavra-chave para instruir explicitamente o Python que estamos modificando uma variável não local.

Quando você usa a nonlocalpalavra-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' foundLinguagem de código:  JavaScript  ( javascript )

De dentro da innerfunção, usamos a nonlocalpalavra-chave da messagevariável.

Portanto, Python procura a messagevariável no escopo envolvente, que é o escopo da outerfunção.

Como o escopo da outerfunção não possui messagevariável e o Python não procura mais no escopo global, ele gera um erro:

Escopos não locais do Python - pesquisa de variável não local

Resumo

  • Os escopos envolventes das funções internas são chamados de escopos não locais.
  • Use a nonlocalpalavra-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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *