O que a nonlocal
instrução Python faz (no Python 3.0 e posterior)?
Não há documentação no site oficial do Python e help("nonlocal")
também não funciona.
python
closures
global
python-nonlocal
ooboo
fonte
fonte
"There is no documentation for nonlocal".
Na verdade, você pode fazerhelp(keyword_in_string)
para documentações em Python 3 e acimaRespostas:
Compare isso sem usar
nonlocal
:Para isso, usando
nonlocal
, whereinner()
'sx
é agora tambémouter()
éx
:fonte
Em resumo, permite atribuir valores a uma variável em um escopo externo (mas não global). Veja PEP 3104 para todos os detalhes sangrentos.
fonte
Uma pesquisa no Google por "python não-local" exibiu a proposta, PEP 3104 , que descreve completamente a sintaxe e o raciocínio por trás da declaração. em resumo, funciona exatamente da mesma maneira que a
global
instrução, exceto que é usada para se referir a variáveis que não são globais nem locais para a função.Aqui está um breve exemplo do que você pode fazer com isso. O contador gerador pode ser reescrito para usar isso, para que ele se pareça mais com os idiomas de idiomas com fechamento.
Obviamente, você pode escrever isso como um gerador, como:
Mas, embora seja um python perfeitamente idiomático, parece que a primeira versão seria um pouco mais óbvia para iniciantes. Usar corretamente geradores, chamando a função retornada, é um ponto comum de confusão. A primeira versão retorna explicitamente uma função.
fonte
nonlocal
declaração em Python; Se você quer uma sequência de números naturais, a linguagem python é realmenteitertools.count()
@ooboo:
Leva o "mais próximo" do ponto de referência no código-fonte. Isso é chamado de "Escopo Lexical" e é padrão há mais de 40 anos.
Os membros da classe do Python estão realmente em um dicionário chamado
__dict__
e nunca serão alcançados pelo escopo lexical.Se você não especificar,
nonlocal
mas simx = 7
, ele criará uma nova variável local "x". Se você especificarnonlocal
, ele encontrará o "mais próximo" "x" e o atribuirá a ele. Se você especificarnonlocal
e não houver "x", será exibida uma mensagem de erro.A palavra
global
- chave sempre me pareceu estranha, pois felizmente ignorará todos os outros "x", exceto o mais externo. Esquisito.fonte
Fonte: Referência da Linguagem Python
fonte
help()
palavras-chave (e agora minha mente está soprada:help()
sem argumentos, fica interativo ).Citação da referência do Python 3 :
Como dito na referência, no caso de várias funções aninhadas, apenas a variável na função envolvente mais próxima é modificada:
A variável "mais próxima" pode estar a vários níveis:
Mas não pode ser uma variável global:
fonte
fonte
Meu entendimento pessoal da declaração "não-local" (e desculpem-me por ser novo no Python e na Programação em geral) é que o "não-local" é uma maneira de usar a funcionalidade Global nas funções iteradas, em vez do corpo do próprio código . Uma declaração global entre funções, se desejar.
fonte
com funções internas 'não locais' (ou seja, funções internas aninhadas) podem obter permissão de leitura e ' gravação ' para essa variável específica da função pai externa . E não-local pode ser usado apenas dentro de funções internas, por exemplo:
fonte