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?
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
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.
Foo est une variable globale de module (ce n'est dans aucune fonction). Toutes les étendues du module peuvent y accéder.
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.