Routineaufgaben mit Python automatisieren. Al Sweigart

Routineaufgaben mit Python automatisieren - Al Sweigart


Скачать книгу
Variablen im globalen Gültigkeitsbereich als globale Variablen. Eine Variable ist entweder lokal oder global, aber niemals beides.

      Den Gültigkeitsbereich können Sie sich wie einen Behälter für Variablen vorstellen. Wird ein Gültigkeitsbereich zerstört, so gehen alle Werte der darin enthaltenen Variablen verloren. Es gibt nur einen globalen Gültigkeitsbereich. Er wird erstellt, wenn das Programm beginnt, und am Ende des Programms zerstört. Damit sind alle seine Variablen vergessen. Wäre das nicht der Fall, so würden beim nächsten Start des Programms alle Variablen immer noch die Werte aufweisen, die sie bei der letzten Ausführung hatten.

      Ein lokaler Gültigkeitsbereich entsteht beim Aufruf einer Funktion. Jegliche Variablen, die in dieser Funktion zugewiesen werden, befinden sich in diesem lokalen Gültigkeitsbereich. Wenn die Funktion die Steuerung zurückgibt, wird der lokale Gültigkeitsbereich zerstört, sodass seine Variablen verloren gehen. Beim nächsten Aufruf der Funktion sind die Werte, die beim letzten Aufruf in den lokalen Variablen gespeichert waren, nicht mehr vorhanden. Die lokalen Variablen werden auch in Frameobjekten auf dem Aufrufstack abgelegt.

      Das Prinzip der Gültigkeitsbereiche hat einige wichtige Auswirkungen:

       Code im globalen Gültigkeitsbereich, also außerhalb von Funktionen, kann keine lokalen Variablen nutzen.

       Code im lokalen Gültigkeitsbereich kann dagegen auf globale Variablen zugreifen.

       Code im lokalen Gültigkeitsbereich einer Funktion kann keine Variablen aus anderen lokalen Gültigkeitsbereichen nutzen.

       Sie können für zwei Variablen den gleichen Namen wählen, sofern sie sich in unterschiedlichen Gültigkeitsbereichen befinden. Es kann also beispielsweise sowohl eine lokale als auch eine globale Variable namens spam geben.

      Warum gibt es in Python verschiedene Gültigkeitsbereiche, anstatt alle Variablen global zu machen? Wenn eine Variable durch den Code in einem bestimmten Funktionsaufruf bearbeitet wird, dann interagiert die Funktion mit dem Rest des Programms nur durch ihre Parameter und den Rückgabewert. Bei einem Fehler schränkt das die Menge der Codezeilen ein, die dafür verantwortlich sein können. Wenn in einem Programm, das ausschließlich globale Variablen enthält, ein Fehler dafür sorgt, dass einer Variablen ein falscher Wert zugewiesen wird, ist es ziemlich schwer, die entsprechende Stelle zu finden. Dieser Wert könnte überall in dem Programm zugewiesen worden sein – und das kann irgendwo in Hunderten oder gar Tausenden von Zeilen sein! Wenn aber eine lokale Variable einen falschen Wert hat, dann wissen Sie, dass er nur im Code der entsprechenden Funktion zugewiesen worden sein kann.

      In kurzen Programmen ist die Verwendung globaler Variablen kein Problem, doch bei längeren Programmen sollten Sie sich lieber nicht darauf stützen.

       Lokale Variablen können im globalen Gültigkeitsbereich nicht verwendet werden

      Wenn Sie das folgende Programm ausführen, erhalten Sie eine Fehlermeldung:

      def spam():

      eggs = 31337 image

      spam()

      print(eggs)

      Die Ausgabe lautet wie folgt:

      Traceback (most recent call last):

      File "C:/test1.py", line 4, in <module>

      print(eggs)

      NameError: name 'eggs' is not defined

      Das liegt daran, dass die Variable eggs nur in dem lokalen Gültigkeitsbereich existiert, der beim Aufruf von spam() erstellt wird (image). Sobald die Programmausführung spam verlässt, wird dieser lokale Gültigkeitsbereich aber zerstört, weshalb es keine Variable namens eggs mehr gibt. Wenn das Programm versucht, print(eggs) auszuführen, meldet Python, dass eggs nicht definiert ist. Wenn Sie ein wenig darüber nachdenken, ist das auch tatsächlich sinnvoll. Während sich die Programmausführung im globalen Gültigkeitsbereich bewegt, gibt es keine lokalen Gültigkeitsbereiche und damit kann es auch keine lokalen Variablen geben. Aus diesem Grunde lassen sich im globalen Gültigkeitsbereich ausschließlich globale Variablen verwenden.

       Lokale Gültigkeitsbereiche können keine Variablen aus anderen lokalen Gültigkeitsbereichen verwenden

      Beim Aufruf einer Funktion wird ein neuer lokaler Gültigkeitsbereich erstellt. Das gilt auch dann, wenn die Funktion aus einer anderen Funktion heraus aufgerufen wird. Betrachten Sie dazu das folgende Programm:

      def spam():

      eggs = 99 image

      bacon() image

      print(eggs) image

      def bacon():

      ham = 101

      eggs = 0 image

      spam() image

      Die Ausführung dieses Programms können Sie sich auf https://autbor.com/otherlocalscopes/ ansehen. Zu Beginn wird hier die Funktion spam() aufgerufen (image) und damit ein lokaler Gültigkeitsbereich erstellt. Die lokale Variable eggs (image) wird auf 99 gesetzt. Daraufhin wird die Funktion bacon() aufgerufen (image) und ein zweiter lokaler Gültigkeitsbereich erstellt. Mehrere lokale Gültigkeitsbereiche können zur selben Zeit existieren. In diesem neuen lokalen Gültigkeitsbereich wird die lokale Variable ham auf 101 gesetzt. Außerdem wird eine lokale Variable namens eggs erstellt und auf 0 gesetzt (image). Allerdings ist dies eine andere Variable als die im lokalen Gültigkeitsbereich von spam().

      Wenn bacon() die Steuerung zurückgibt, wird der lokale Gültigkeitsbereich für diesen Aufruf und damit auch die Variable eggs zerstört. Die Programmausführung fährt mit der Funktion spam() fort, um den Wert von eggs auszugeben (image). Der lokale Gültigkeitsbereich für den Aufruf von spam() existiert immer noch. Die einzige Variable namens eggs, die es jetzt noch gibt, ist diejenige der Funktion spam(), die auf 99 gesetzt wurde. Das ist der Wert, den das Programm ausgibt.

      Was lernen wir daraus? Lokale Variablen in einer Funktion sind komplett von den lokalen Variablen in einer anderen Funktion getrennt.

       Globale Variablen können von einem lokalen Gültigkeitsbereich aus gelesen werden

      Betrachten Sie das folgende Programm:

      def spam():

      print(eggs)

      eggs = 42

      spam()

      print(eggs)

      Die Ausführung dieses Programms können Sie sich auf https://autbor.com/readglobal/


Скачать книгу