2012-10-09 11 views

Antwort

10

Es gibt nichts Besonderes über if __name__ == '__main__' Block was auch immer. Das heißt, ihr Umfang wird durch den Ort bestimmt, an dem sie auftritt. Da solche Blöcke typischerweise auf oberster Ebene auftreten, ist ihr Geltungsbereich global.

Wenn dieser Block in einer Funktion auftreten würde, die vollkommen legal ist, würde der Bereich lokal sein - außer dass __name__ immer noch auf den globalen Wert aufgelöst wird, der im Modul definiert ist.

5
>>> if __name__ == '__main__': 
...  x = 1 
... print 'x' in globals() 
True 

bearbeitet: user4815162342 macht den hervorragenden Punkt, dass diese if-Anweisung kann in jeden Rahmen geschrieben werden. Es wird meistens im globalen Bereich geschrieben.

Hier ist es in einer Funktion:

>>> def foo(): 
...  if __name__ == '__main__': 
...   bar = 1 
... foo() 
... print 'bar' in globals() 
False 
+1

Etwas verwirrend, es ist auch in 'Locals()': http://ideone.com/WbvTj. Vermutlich ist der globale Geltungsbereich auf der obersten Ebene des Moduls derselbe wie der lokale. – millimoose

3

Python nicht Block-lokalen Bereich hat, so dass alle Variablen, die Sie innerhalb eines if Block verwenden, um den nächsten einschließe „echten“ Umfang hinzugefügt werden. (Für einen if..main Block, werden sie in der Regel Attribute des Moduls sein.)

1

Es ist im globalen Bereich solange:

  1. es im globalen Bereich genannt wird, also nicht aus einem Funktion
  2. ist es in der Code-Datei, die ausgeführt wird.

Zur Veranschaulichung (2):

Angenommen, du bist Code in foo.py ist, und in bar.py, haben Sie die Anweisung from foo import *. In diesem Fall wird der if __name__ == "__main__": Block in foo.py nicht ausgeführt. Dieser Block wird nur ausgeführt, wenn foo.py ausgeführt wird

+0

Tatsächlich wird 'if __name__ == '__main __'' Block nur gut ausgeführt, es ist nur so, dass '__name__' nicht '__main__' ist, sondern' foo'. Diese Einstellung von '__name__' ist vollständig orthogonal zu den Regeln für variable Bereiche. – user4815162342

+0

@ user4815162342: Du hast Recht. Ich wollte nur sicherstellen, dass das OP nicht 'foo' in' bar' importiert und sich fragt, warum Variablen in 'if __name__ ==" __main __ "' in 'foo' nicht in' bar's auftauchen globaler Geltungsbereich. – inspectorG4dget

Verwandte Themen