Was ist der Scope?
Mit einem Wort, es ist der gültige Bereich einer Variablen (usw.).
Ein kurzer Rückblick
Bis jetzt haben Sie gesehen, dass eine Variable von ihrer ersten Verwendung (Definition) bis zum Ende verwendet werden kann.
# test
a = 10
print(a)
In diesem Fall kann die Variable a
ab der dritten Zeile verwendet werden.
Funktionsargumente
In Abschnitt Funktionen haben wir gelernt, dass Argumente nur innerhalb dieser Funktion verwendet werden können. Überprüfen wir das genau.
Verwenden wir zum Beispiel die folgende Funktion.
In diesem Fall ist num_from
eine Variable, die nur innerhalb dieser
Funktion verwendet werden kann.
def calc_sum3(num_from):
summation = 3 * num_from + 3
return summation
Daher wird das folgende Programm zu einem Fehler führen:
def calc_sum3(num_from):
summation = 3 * num_from + 3
return summation
print(num_from) # Fehler
Sie könnten denken:
.
Aber auch das folgende Programm führt zu einem Fehler.num_from
wurde noch nicht erstellt, weil calc_sum3()
noch nicht ausgeführt wurde
def calc_sum3(num_from):
summation = 3 * num_from + 3
return summation
print(calc_sum3(1))
print(num_from) # Fehler
Dies bedeutet, dass Argumente nur innerhalb dieser Funktion verwendet werden können.
Innerhalb einer Funktion definierte Variablen
Betrachten wir noch einmal die folgende Funktion.
def calc_sum3(num_from):
summation = 3 * num_from + 3
return summation
In diesem Programm ist summation
ebenfalls eine Variable, die nur
innerhalb dieser Funktion verwendet werden kann.
Daher wird das folgende Programm zu einem Fehler führen
def calc_sum3(num_from):
summation = 3 * num_from + 3
return summation
print(summation) # Fehler
Was passiert nun im folgenden Beispiel?
Sagen Sie voraus, was angezeigt wird, wenn Sie das folgende Programm ausführen. Prüfen Sie es dann, indem Sie das Programm eingeben und ausführen. Prüfen Sie erneut, warum das Ergebnis zustande gekommen ist.
summation = 10
def calc_sum3(num_from):
summation = 3 * num_from + 3
print("summation in calc_sum3():", summation)
return summation
print("summation:", summation)
print("result of calc_sum3():", calc_sum3(1))
print("summation:", summation)
In diesem Programm werden drei Variablen verwendet.
Eine ist num_from
, eine andere ist summation
außerhalb der
Funktion, und eine dritte ist summation
innerhalb der Funktion.
Die letzten beiden haben zufällig den gleichen Namen summation
,
sind aber eigentlich unterschiedliche Variablen.
Näher betrachtet wird summation
zunächst in der ersten Zeile
erstellt.
Dann wird calc_sum3()
aufgerufen (zweite Zeile vom Ende) und eine
neue summation
wird erstellt.
Jetzt ist die in Zeile 1 definierte summation
nicht sichtbar, aber
sie ist nicht verschwunden.
Wenn die Ausführung von calc_sum3()
beendet ist, verschwindet die
von calc_sum3()
erstellte summation
, und die ursprüngliche
summation
wird wieder sichtbar.
Daher zeigt print(summation)
in der letzten Zeile den Wert der in
der ersten Zeile erstellten summation
, nämlich 10, angezeigt.
Scope
Der Gültigkeitsbereich einer Variablen, wie oben beschrieben, wird als Scope bezeichnet. Im Falle einer Funktion ist der Gültigkeitsbereich einer Variablen auf den Bereich innerhalb der Funktion beschränkt, was als lokaler Scope bezeichnet wird. Eine Variable in einem lokalen Scope wird als lokale Variable bezeichnet.
In der obigen Übung ist summation
der ersten Zeile im Prinzip für
das gesamte Programm gültig, so dass dieser Gültigkeitsbereich als
globaler Scope bezeichnet wird und eine solche Variable eine globale
Variable heißt.
Globale Variablen sollten jedoch in der Regel nicht verwendet werden. Bei kurzen Programmen ist das Auftreten von Problemen unwahrscheinlich, aber mit zunehmendem Umfang des Programms können verschiedene nachteilige Auswirkungen auftreten. Wenn ein Problem festgestellt wird, das durch eine globale Variable verursacht wird, ist es schwierig festzustellen, wo das Problem auftritt, insbesondere wenn die Variable an verschiedenen Stellen im Programm verwendet wird. Wenn beispielsweise eine Variable einen unerwarteten Wert enthält und es sich um eine lokale Variable handelt, ist es sehr wahrscheinlich, dass die Verarbeitung innerhalb der Funktion fehlerhaft ist oder ein Problem mit dem Funktionsaufruf (Argumente) vorliegt. Handelt es sich jedoch um eine globale Variable, ist es schwierig, die Ursache einzugrenzen.
Daher sollte der Scope der Variablen so eng wie möglich sein.
Daraus folgt:
Mit anderen Worten, eine Funktion sollte so geschrieben sein, dass die Funktion
-
externe Informationen (Anweisungen von außen) nur über seine Argumente empfängt, und
-
nur im Rückgabewert Informationen an die Außenwelt (Außerhalb der Funktion) weitergibt, und
-
keine Auswirkungen auf die Außerhalb der Funktion hat.
Um es konkreter zu formulieren:
-
In einer Funktion sollten nur die als Argumente definierten Variablen und die in der Funktion definierten Variablen verwendet werden, und
-
Variablen außerhalb der Funktion sollten nicht direkt in der Funktion gelesen oder verändert werden.
Auch hier gilt: Ein gutes Programm ist eines, bei dem Fehler möglichst unwahrscheinlich sind und, falls sie doch auftreten, leicht zu erkennen sind. Das mag anfangs schwierig sein, aber bedenken Sie dies.
Wenn Sie andere Sprachen kennen, fragen Sie sich vielleicht, was in
if
, for
usw. passiert.
In Python haben diese keinen lokalen Scope.
Dies kann zum Beispiel durch die Ausführung des folgenden Programms bestätigt werden.
x = 10
if x > 5:
x = 100
else:
x = 0
print(x)
In diesem Programm sind alle x
dieselben Variablen.
Anmerkung
Die Geschichte hier ist ein wenig komplizierter. Sie können die Lektüre zunächst auslassen. Insbesondere, wenn Sie sich nicht sicher sind, ob Sie den oben genannten Inhalt verstehen, ist zu empfehlen, diesen nicht jetzt zu lesen, da Sie sonst verwirrt werden könnten.
Wichtig ist nur, dass globale Variablen im Prinzip nicht verwendet werden sollten.
Was wird passieren, wenn Sie das folgende Programm ausführen?
# ! Schlechte Schreibweise !
summation = 10
def test():
print(summation)
test()
Wie bereits erläutert, kann eine in einer Funktion definierte
Variable nur innerhalb dieser Funktion verwendet werden.
Wenn jedoch eine Variable verwendet wird, ohne dass sie in einer
Funktion definiert ist, wird die globale Variable (sofern vorhanden)
verwendet.
In diesem Fall ist es möglich, die globale Variable innerhalb einer
Funktion zu lesen
, so dass bei der Ausführung dieses
Programms der Wert 10 (ohne Fehler) angezeigt wird.
Es ist jedoch sehr schwer zu erkennen, wo summation
in diesem
Programm definiert oder geändert wird.
Außerdem ist es schwierig festzustellen, ob dies absichtlich oder aus
Versehen so geschrieben wurde.
Daher sollte diese Art des Schreibens vermieden werden.
Nochmals: Funktionen sollten nur über Argumente und Rückgabewerte mit
der Außenwelt interagieren.
Eine Möglichkeit, solche Probleme zu vermeiden, besteht darin, eine main()
-Funktion zu erstellen.
(Sie kann beliebig benannt werden, aber normalerweise benutzt man den Namen main
.)
Angenommen, Sie haben das folgende Programm geschrieben.
def calc_sum3(num_from):
summation = 3 * num_from + 3
return summation
n = 10
print(calc_sum(n))
Dies lässt sich besser wie folgt formulieren.
def calc_sum3(num_from):
summation = 3 * num_from + 3
return summation
def main():
n = 10
print(calc_sum(n))
main()
Im Originalprogramm war n
eine globale Variable, aber in der neu
geschriebenen Version werden keine globalen Variablen verwendet.
Der Hauptteil des Programms besteht nur aus der letzten Zeile
main()
, und alles andere in diesem Programm sind
Funktionsdefinitionen.
Es gibt keinen Vorteil, ein so kurzes Programm auf diese Weise zu verfassen, aber mit zunehmendem Umfang des Programms wird die Verwaltung der Variablen immer schwieriger, so dass es sehr wichtig ist, den Scope der Variablen einzugrenzen, um sie leichter verwalten zu können.
Es ist nicht möglich, globale Variablen innerhalb einer Funktion zu ändern. (Eine solche Methode existiert zwar, sollte aber nicht verwendet werden.)