Ich bin neu in Python, daher ist dies wahrscheinlich eine einfache Frage. Der folgende Code in einer Python-Datei (Modul) verwirrt mich leicht:
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
Variable lokal für die if
Anweisung ist und nicht außerhalb der Anweisung existieren sollte. Aber dieser Code wird ausgeführt und gedruckt 1. Kann jemand dieses Verhalten erklären? Sind alle in einem Modul erstellten Variablen global / für das gesamte Modul verfügbar?
if
obige Anweisung nicht zutrifft (dh__name__
beispielsweise nicht'__main__'
, wenn Sie das Modul importieren, anstatt es auf oberster Ebene auszuführen), wurdex
es nie gebunden, und die nachfolgendeprint x
Anweisung wird ein werfenNameError: name 'x' is not defined
.Antworten:
Python-Variablen sind auf die innerste Funktion, Klasse oder das innerste Modul beschränkt, in dem sie zugewiesen sind. Steuerblöcke wie
if
undwhile
Blöcke zählen nicht, daher wird eine Variable in einem zugewiesenif
Steuerblöcke weiterhin einer Funktion, Klasse oder einem Modul zugeordnet ist.(Implizite Funktionen, die durch einen Generatorausdruck oder ein Listen- / Satz- / Diktatverständnis definiert werden , zählen ebenso wie Lambda-Ausdrücke. Sie können keine Zuweisungsanweisung in eine dieser Funktionen einfügen, aber Lambda-Parameter und
for
Klauselziele sind implizite Zuweisungen.)quelle
Ja, sie befinden sich im selben "lokalen Bereich", und tatsächlich ist Code wie dieser in Python üblich:
Beachten Sie, dass dies
x
nicht vor der Bedingung deklariert oder initialisiert wird, wie dies beispielsweise in C oder Java der Fall wäre.Mit anderen Worten, Python verfügt nicht über Bereiche auf Blockebene. Seien Sie jedoch vorsichtig mit Beispielen wie
das würde eindeutig eine
NameError
Ausnahme auslösen.quelle
Der Umfang in Python folgt dieser Reihenfolge:
Suchen Sie den lokalen Bereich
Durchsuchen Sie den Umfang aller umschließenden Funktionen
Suchen Sie den globalen Bereich
Durchsuchen Sie die integrierten Funktionen
( Quelle )
Beachten Sie, dass
if
und andere Schleifen- / Verzweigungskonstrukte nicht aufgelistet sind. Nur Klassen, Funktionen und Module bieten in Python einenif
Gültigkeitsbereich. Daher hat alles, was in einem Block deklariert wird, denselben Gültigkeitsbereich wie alles, was außerhalb des Blocks deklariert wurde. Variablen werden beim Kompilieren nicht überprüft, weshalb andere Sprachen eine Ausnahme auslösen. In Python wird keine Ausnahme ausgelöst, solange die Variable zum gewünschten Zeitpunkt vorhanden ist.quelle
Wie Eli sagte, benötigt Python keine Variablendeklaration. In C würden Sie sagen:
In Python ist die Deklaration jedoch implizit. Wenn Sie also x zuweisen, wird sie automatisch deklariert. Dies liegt daran, dass Python dynamisch typisiert ist - es würde in einer statisch typisierten Sprache nicht funktionieren, da abhängig vom verwendeten Pfad eine Variable möglicherweise verwendet wird, ohne deklariert zu werden. Dies würde zur Kompilierungszeit in einer statisch typisierten Sprache abgefangen werden, aber mit einer dynamisch typisierten Sprache ist dies zulässig.
Der einzige Grund, warum eine statisch typisierte Sprache
if
aufgrund dieses Problems darauf beschränkt ist, Variablen außerhalb von Anweisungen in deklarieren zu müssen . Umfassen Sie die Dynamik!quelle
Im Gegensatz zu Sprachen wie C ist eine Python-Variable nicht nur im innersten "Block" für die gesamte Funktion (oder Klasse oder Modul) verfügbar, in der sie angezeigt wird. Es ist, als hättest du es erklärt
int x
oben in der Funktion (oder Klasse oder im Modul) deklariert, außer dass Sie in Python keine Variablen deklarieren müssen.Beachten Sie, dass die Existenz der Variablen
x
nur zur Laufzeit überprüft wird, dh wenn Sie zurprint x
Anweisung gelangen. Wenn__name__
nicht gleich,"__main__"
dann würden Sie eine Ausnahme bekommen :NameError: name 'x' is not defined
.quelle
Ja. Dies gilt auch für den
for
Umfang. Funktioniert aber natürlich nicht.In Ihrem Beispiel: Wenn die Bedingung in der
if
Anweisung falsch ist,x
wird sie jedoch nicht definiert.quelle
Sie führen diesen Code über die Befehlszeile aus, daher sind die
if
Bedingungen wahr undx
festgelegt. Vergleichen Sie:quelle
Und da Python-Typen nur zur Laufzeit überprüft werden, können Sie folgenden Code haben:
Ich habe jedoch Probleme, mir andere Möglichkeiten auszudenken, wie der Code aufgrund von Typproblemen fehlerfrei funktionieren würde.
quelle