475 votes

Déclaration non locale en python

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.

653voto

Anon Points 3418

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
 

128voto

Arkady Points 4015

En bref, il vous permet d’attribuer des valeurs à une variable dans une étendue externe (mais non globale). Voir PEP 3104 pour tous les détails sanglants.

55voto

IfLoop Points 59461

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.

24voto

@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.

17voto

Yossi Truzman Points 41

de l'aide('non') L' nonlocal déclaration


    nonlocal_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 un global 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X