425 Stimmen

Was ist der Geltungsbereich einer in einer if-Anweisung initialisierten Variablen?

Ich bin neu in Python, so dass dies wahrscheinlich eine einfache Scoping-Frage ist. Der folgende Code in einer Python-Datei (Modul) verwirrt mich etwas:

if __name__ == '__main__':
    x = 1

print x

In anderen Sprachen, in denen ich gearbeitet habe, würde dieser Code eine Ausnahme auslösen, da die x ist eine lokale Variable in der if Anweisung und sollte nicht außerhalb von ihr existieren. Aber dieser Code wird ausgeführt und gibt 1 aus. Kann jemand dieses Verhalten erklären? Sind alle Variablen, die in einem Modul erstellt werden, global/für das gesamte Modul verfügbar?

531voto

Luke Maurer Punkte 6825

Python-Variablen sind auf die innerste Funktion, Klasse oder das Modul beschränkt, in dem sie zugewiesen sind. Kontrollblöcke wie if y while Blöcke zählen nicht, so dass eine Variable, die innerhalb eines if ist immer noch auf eine Funktion, eine Klasse oder ein Modul beschränkt.

(Implizite Funktionen, die durch einen Generatorausdruck oder ein List/Set/Dict-Verständnis definiert sind tun zählen, ebenso wie die Lambda-Ausdrücke. Sie können keine Zuweisungsanweisung in einen dieser Ausdrücke einfügen, aber Lambda-Parameter und for Klauselziele sind implizite Zuweisungen).

178voto

Eli Bendersky Punkte 246100

Ja, sie sind in der gleichen "lokalen Bereich", und tatsächlich Code wie dieser ist in Python üblich:

if condition:
  x = 'something'
else:
  x = 'something else'

use(x)

Beachten Sie, dass x wird nicht vor der Bedingung deklariert oder initialisiert, wie es zum Beispiel in C oder Java der Fall wäre.

Mit anderen Worten: Python verfügt nicht über Block-Level-Scopes. Seien Sie jedoch vorsichtig mit Beispielen wie

if False:
    x = 3
print(x)

was eindeutig ein Problem darstellen würde NameError Ausnahme.

49voto

Daniel G Punkte 62538

Der Geltungsbereich in Python folgt dieser Reihenfolge:

  • Suche im lokalen Bereich

  • Suche im Bereich aller umschließenden Funktionen

  • Suche im globalen Bereich

  • Suche in den Einbauten

( Quelle )

Beachten Sie, dass if und andere Schleifen-/Verzweigungskonstrukte sind nicht aufgeführt - nur Klassen, Funktionen und Module haben in Python einen Geltungsbereich, so dass alles, was in einer if Block hat den gleichen Geltungsbereich wie alles, was außerhalb des Blocks freigegeben wird. Variablen werden zur Kompilierzeit nicht überprüft, weshalb andere Sprachen eine Ausnahme auslösen. In Python wird keine Ausnahme ausgelöst, solange die Variable zu dem Zeitpunkt existiert, zu dem Sie sie benötigen.

17voto

Paul Stephenson Punkte 63913

Anders als in Sprachen wie C gilt eine Python-Variable für die gesamte Funktion (oder Klasse oder Modul), in der sie auftaucht, und nicht nur für den innersten "Block". Es ist, als ob Sie deklarieren int x am Anfang der Funktion (oder Klasse oder Modul), außer dass man in Python keine Variablen deklarieren muss.

Beachten Sie, dass das Vorhandensein der Variablen x wird nur zur Laufzeit geprüft, d.h. wenn Sie die print x Erklärung. Wenn __name__ war nicht gleich "__main__" würden Sie eine Ausnahme erhalten: NameError: name 'x' is not defined .

15voto

Skilldrick Punkte 66961

Wie Eli schon sagte, ist in Python keine Variablendeklaration erforderlich. In C würden Sie sagen:

int x;
if(something)
    x = 1;
else
    x = 2;

aber in Python ist die Deklaration implizit, d.h. wenn Sie x zuweisen, wird es automatisch deklariert. Das liegt daran, dass Python dynamisch typisiert ist - in einer statisch typisierten Sprache würde das nicht funktionieren, da je nach verwendetem Pfad eine Variable verwendet werden könnte, ohne deklariert zu sein. In einer statisch typisierten Sprache würde dies bei der Kompilierung abgefangen werden, aber in einer dynamisch typisierten Sprache ist es erlaubt.

Der einzige Grund, warum eine statisch typisierte Sprache darauf beschränkt ist, Variablen außerhalb von if Aussagen wegen dieses Problems. Machen Sie sich die Dynamik zu eigen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X