__main__ und der Festlegung des lösungsumfangs in python
War ich irgendwie überrascht, indem Sie das folgende Verhalten:
def main():
print "%s" % foo
if __name__ == "__main__":
foo = "bar"
main()
d.h. eine Modul-Funktion hat Zugriff auf die umschließenden Variablen in der __main__
. Was ist die Erklärung dafür?
- Es gibt keinen Spielraum
__main__
. Es gibt eineif
passiert, zu vergleichen eine variable, die passiert werden genannt__name__
zu etwas, das passiert zu sein, das string-literal"__main__"
. __main__
ist ein Modul, und jedes Modul verfügt über einen zugeordneten Bereich. Versuchenimport __main__; type(__main__)
im interpreter (nicht in IPython).- Ich weiß. OP sollte wissen, an einem gewissen Punkt. Aber es schien mir OP statt verwirrt, wenn Aussagen über Teile der Bedingung und denke
if
führt einen neuen Bereich - was würde sein, zu einem immer dringlicheren Thema. (Zugegeben, "Es gibt keinen Spielraum__main__
ist irreführend, streng genommen) - du hast Recht. Im Nachhinein, ich weiß nicht, warum ich verwirrt war. Vielleicht ist das Debuggen von code auf 3 ein.m ist keine so gute Idee, nachdem alle 🙂
- Ich stolperte über genau dem gleichen Verhalten...dachte, ich wäre verrückt. Froh zu sehen, hat jemand bereits diese Frage gestellt! Das Verhalten ist offensichtlich, wenn die Antwort erklärt...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Variablen in der aktuellen Module global scope-sichtbar sind überall in der Modul -- diese Regel gilt auch für die
__main__
Modul.Vom Guido ' s tutorial:
__main__
Modul?__main__
. Sie können sogar tunimport __main__
(aber in der Regel, dass es eine Schlechte Idee ist).Die Sache hier ist, dass:
definiert eine Globale variable mit Namen foo, die im Skript. also jede Funktion des Moduls wird Zugriff darauf haben.
Stück der oben aufgeführten code ist global für das Modul und nicht in jeder Funktion.
foo ist eine Modul-Globale variable (es ist nicht in irgendeiner Funktion). Alle Bereiche innerhalb des Moduls zugreifen kann.
In python gibt es die Globale Reichweite und die Funktionen haben Ihre eigenen Bereiche. Also Sie definieren foo unter dem Namen==Haupt, es ist im globalen Bereich. Auch, es ist nicht ein Fehler, eine variable zu verwenden, die noch nicht erklärt wurden, noch, in einer Funktion, wenn es erklärt wird, durch die Zeit, die die Funktion aufgerufen wird.