__main__ und scoping in python

Ich war irgendwie überrascht von folgendem Verhalten:

def main(): print "%s" % foo if __name__ == "__main__": foo = "bar" main() 

__main__ hat Zugriff auf umschließende Variablen im __main__ . Was ist die Erklärung dafür?

4 Solutions collect form web for “__main__ und scoping in python”

Variablen im aktuellen Modul globalen Bereich sind überall im Modul sichtbar – diese Regel gilt auch für das Modul __main__ .

Aus Guido's Tutorial :

Zu jeder Zeit während der Ausführung gibt es mindestens drei verschachtelte Bereiche, deren Namespaces direkt zugänglich sind:

  • Der innerste Bereich, der zuerst gesucht wird, enthält die Ortsnamen
  • Die Bereiche der umschließenden Funktionen, die mit dem nächstgelegenen Umfangsbereich gesucht werden, enthalten nicht-lokale, aber auch nicht-globale Namen
  • Der next-to-last-Bereich enthält die globalen Namen des aktuellen Moduls
  • Der äußerste Bereich (zuletzt gesucht) ist der Namespace mit eingebauten Namen

Foo ist ein Modul globale Variable (es ist nicht in irgendeiner Funktion). Alle Bereiche innerhalb des Moduls können darauf zugreifen.

Das ist hier:

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

Definiert eine globale Variable namens foo in diesem Skript. So dass jede Funktion dieses Moduls Zugriff darauf haben wird.

Der oben aufgeführte Code ist global zum Modul und nicht in einer beliebigen Funktion.

In python gibt es den globalen Bereich, und die Funktionen haben ihre eigenen Bereiche. So definieren Sie foo unter dem Namen == main, es ist im globalen Bereich. Auch ist es nicht ein Fehler, eine Variable zu verwenden, die noch nicht deklariert wurde, in einer Funktion, wenn sie durch die Zeit, die die Funktion aufgerufen wird, deklariert wird.

  • Wie kann ich auf eine Klassenvariable in einem Initialisierer in Python zugreifen?
  • Zweifel über python variablen Bereich
  • "Lokale Variable referenziert vor Zuordnung" - nur Funktionen?
  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Pythonumfang [doppelte]
  • Kurze Beschreibung der Scoping Regeln?
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Wie kann man Variablen eines anderen Bereichs ändern?
  • Warum können Funktionen in Python-Druckvariablen im Umschließungsbereich funktionieren, können sie aber nicht in der Zuordnung verwenden?
  • Scoping in Python 'für' Schleifen
  • Python ist die beste Programmiersprache der Welt.