principal et portée en python

J'ai été surpris par le comportement suivant:

def main():
    print "%s" % foo

if __name__ == "__main__":
    foo = "bar"
    main()

C'est-à-dire qu'une fonction de module a accès aux variables englobantes dans le __main__. Quelle est l'explication pour cela?

22
demandé sur SilentGhost 2011-01-23 21:30:15

4 réponses

Les Variables de la portée globale des modules actuels sont visibles partout dans le module-cette règle est également valable pour le module __main__.

De tutoriel de Guido :

À tout moment de l'exécution, il existe au moins trois étendues imbriquées dont les espaces de noms sont directement accessibles:

  • la portée la plus interne, qui est recherchée en premier, contient les noms locaux
  • les étendues de toutes les fonctions englobantes, qui sont recherchées en commençant par proche englobant la portée, contient des noms non locaux, mais aussi Non globaux
  • l'avant-dernière portée contient les noms globaux du module actuel
  • la portée la plus externe (recherchée en dernier) est l'espace de noms contenant les noms intégrés
21
répondu Sven Marnach 2011-01-23 18:45:34

La chose ici est que:

if __name__ == "__main__":
    foo = "bar"

Définit une variable globale nommée foo dans ce script. donc, toute fonction de ce module y aura accès.

Le morceau de code répertorié ci-dessus est global au module et non à l'intérieur d'une fonction.

7
répondu Santiago Alessandri 2011-01-23 18:34:56

Foo est une variable globale de module (ce n'est dans aucune fonction). Toutes les étendues du module peuvent y accéder.

6
répondu sinelaw 2011-01-23 18:32:29

En python, il y a la portée globale, et les fonctions ont leurs propres étendues. Donc, vous définissez foo sous le nom==main, c'est dans la portée globale. Aussi, ce n'est pas une erreur d'utiliser une variable qui n'a pas été encore déclarée dans une fonction, si elle est déclarée par le temps, la fonction sera appelée.

2
répondu kynnysmatto 2011-01-23 18:39:14