Programmierkurs
für Naturwissenschaftler/innen

Scope

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: num_from wurde noch nicht erstellt, weil calc_sum3() noch nicht ausgeführt wurde . Aber auch das folgende Programm führt zu einem Fehler.

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)

Ergebnis

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.

(Wiederholung) Argumente einer Funktion sowie Variablen, die innerhalb einer Funktion erstellt werden, können nur innerhalb dieser Funktion verwendet werden.

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.

Indem man den Scope der Variablen so weit wie möglich eingrenzt, ist es (oft) einfacher, die Ursache von Problemen zu finden, wenn sie auftreten.

Daraus folgt:

Sie sollten mit der Funktion nur via Argumenten und Rückgabewerten interagieren.

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.

Anmerkung

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.)