Que fait-il dans Python 3.0? Il n'y a pas de documentation sur le site Web officiel de Python et l'aide ("nonlocal") ne fonctionne pas non plus.
Réponses
Trop de publicités?Comparez cela sans utiliser nonlocal:
>>> def outer():
x = 1
def inner():
x = 2
print("inner:", x)
inner()
print("outer:", x)
>>> outer()
inner: 2
outer: 1
Pour cela, en utilisant nonlocal:
>>> def outer():
x = 1
def inner():
nonlocal x
x = 2
print("inner:", x)
inner()
print("outer:", x)
>>> outer()
inner: 2
outer: 2
Une recherche google pour "python locale" tourné la Proposition, PEP 3104, qui décrit entièrement la syntaxe et le raisonnement derrière la déclaration. en bref, il fonctionne exactement de la même manière que l' global
déclaration, sauf qu'il est utilisé pour faire référence à des variables qui ne sont ni global, ni locale à la fonction.
Voici un bref exemple de ce que vous pouvez faire avec cela. Le compteur générateur peut être réécrit pour utiliser cette sorte qu'il ressemble plus à des idiomes de langues avec des fermetures.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
Évidemment, vous pourriez écrire cela comme un générateur, comme:
def counter_generator():
count = 0
while True:
count += 1
yield count
Mais tout ceci est parfaitement idiomatique python, il semble que la première version est un peu plus évident pour les débutants. Correctement à l'aide de générateurs, en appelant la fonction renvoyée, est un point commun à la confusion. La première version explicitement retourne une fonction.
@ooboo:
Il prend celui le plus proche du point de référence dans le code source. Cette opération est appelée "Portée Lexicale" et est la norme pour les plus de 40 ans maintenant.
Python membres de la classe sont vraiment dans un dictionnaire appelé __dict__
et ne sera jamais atteint par une portée lexicale.
Si vous ne spécifiez nonlocal
mais n' x = 7
, il va créer une nouvelle variable locale "x".
Si vous ne spécifiez nonlocal
, il va trouver le "plus proche" "x" et attribuez-la à qui.
Si vous spécifiez nonlocal
et il n'y a pas de "x", il vous donnera un message d'erreur.
Le mot-clé global
a toujours semblé étrange pour moi, car il se fera un plaisir d'ignorer tous les autres "x" à l'exception de l'extérieur. Bizarre.
de l'aide('non') L'
nonlocal
déclarationnonlocal_stmt ::= "nonlocal" identifier ("," identifier)*
L'
nonlocal
instruction provoque la liste des identifiants pour se référer à précédemment liés à des variables dans le plus proche du cadre englobant. C'est important parce que le comportement par défaut pour la liaison est à la recherche de la espace de noms local d'abord. La déclaration permet à encapsulé code de relier des variables en dehors de la portée locale en plus de la mondiale (module).Liste des noms en
nonlocal
déclaration, contrairement à celles qui sont énumérées dans unglobal
déclaration, il faut se référer aux pré-existantes des liaisons dans un cadre englobant (le cadre dans lequel une nouvelle liaison devrait être créé ne peut pas être déterminée sans ambiguïté).Liste des noms en
nonlocal
déclaration ne doit pas entrer en collision avec la pré- les liaisons existantes dans le domaine local.Voir aussi:
PEP 3104 - l'Accès à des Noms dans des Étendues Extérieures
Le cahier des charges pour l'nonlocal
déclaration.Rubriques d'aide connexes: global, les espaces de noms