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

  • Was bedeutet Umfang
  • Warum ist eine Klassenvariable nicht im Listenverständnis definiert, sondern eine andere ist?
  • Globals und Einheimische in python exec ()
  • Variable Bereiche in Python-Klassen
  • Python - Wie man eine globale Variable aus einer Funktion
  • Zweifel über python variablen Bereich
  • "Lokale Variable referenziert vor Zuordnung" - nur Funktionen?
  • String mit 'f' Präfix in python-3.6
  • Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]
  • Python: Wie kann ich eval () im lokalen Gültigkeitsbereich einer Funktion ausführen?
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Python ist die beste Programmiersprache der Welt.