Читать книгу Routineaufgaben mit Python automatisieren - Al Sweigart - Страница 134

Verweise

Оглавление

Wie Sie bereits wissen, lassen sich Strings und Integerwerte in Variablen »speichern«. Diese Beschreibung stellt jedoch eine Vereinfachung der wahren Vorgänge dar. In Wirklichkeit werden in den Variablen Verweise auf die Speicherorte festgehalten, an denen sich die Werte befinden. Geben Sie Folgendes in die interaktive Shell ein:

>>> spam = 42

>>> cheese = spam

>>> spam = 100

>>> spam

100

>>> cheese

42

Wenn Sie der Variablen spam den Wert 42 zuweisen, erstellen Sie in Wirklichkeit den Wert 42 im Arbeitsspeicher des Computers und speichern lediglich einen Verweis (oder eine Referenz) auf diesen Speicherort in der Variablen. Beim Zuweisen des Wertes in spam zu der Variablen cheese kopieren Sie diesen Verweis. Die Variablen spam und cheese verweisen jetzt beide auf den Wert 42 im Arbeitsspeicher. Wenn Sie den Wert in spam später auf 100 ändern, legen Sie einen neuen Wert 100 an und speichern einen Verweis darauf in spam. Das hat aber keinen Einfluss auf den Wert in cheese. Integer sind unveränderbare Werte. Wenn Sie die Variable spam ändern, lassen Sie sie in Wirklichkeit auf einen ganz anderen Wert im Arbeitsspeicher verweisen.

Listen funktionieren nicht auf diese Weise, da sie veränderbar sind. Der folgende Code macht diesen Unterschied deutlich:

>>> spam = [0, 1, 2, 3, 4, 5]

>>> cheese = spam # Kopiert den Verweis, nicht die Liste

>>> cheese[1] = 'Hello!' # Ändert den Listenwert

>>> spam

[0, 'Hello!', 2, 3, 4, 5]

>>> cheese # Die Variable cheese verweist auf dieselbe Liste

[0, 'Hello!', 2, 3, 4, 5]

Das mag Ihnen merkwürdig vorkommen. Schließlich hat der Code nur die Liste cheese bearbeitet. Aber es scheint, dass beide Listen verändert worden sind!

Wenn Sie die Liste erstellen (), weisen Sie der Variablen spam einen Verweis darauf zu. In der nächsten Zeile aber () wird nicht der Listenwert selbst in cheese kopiert, sondern nur der Listenverweis, der sich in spam befindet. Das bedeutet, dass die in spam und cheese gespeicherten Werte nun beide auf dieselbe Liste verweisen. Es gibt nur eine einzige zugrunde liegende Liste, da die Liste selbst gar nicht kopiert wurde. Wenn Sie daher das zweite Element von cheese ändern (), bearbeiten Sie in Wirklichkeit dieselbe Liste, auf die auch spam verweist.

Gewöhnlich wird gesagt, dass Sie sich Variablen als Kisten vorstellen können, die Werte enthalten. Das ist hier jedoch nicht ganz korrekt, denn in Wirklichkeit enthalten die Variablen gar nicht die Listen selbst, sondern nur Verweise darauf. (Diese Verweise tragen ID-Nummern, die Python intern verwendet, aber darum brauchen wir uns nicht zu kümmern.) Abb. 4–4 zeigt, was geschieht, wenn eine Liste der Variablen spam zugewiesen wird.

Abb. 4–4Mit spam = [0, 1, 2, 3, 4, 5] wird ein Verweis auf die Liste gespeichert, aber nicht die Liste selbst.

In Abb. 4–5 sehen Sie, wie der Verweis in spam zu cheese kopiert wird. Das bedeutet aber nur, dass ein neuer Verweis erstellt und in cheese gespeichert wird, aber keine neue Liste. Beide verweisen auf dieselbe Liste.

Abb. 4–5Mit spam = cheese wird der Verweis kopiert, aber nicht die Liste.

Wenn Sie die Liste ändern, auf die cheese verweist, ändern Sie damit auch die Liste, auf die spam verweist, da es sich dabei um ein und dieselbe handelt. Das können Sie in Abb. 4–6 erkennen.

Abb. 4–6cheese[1] = 'Hello!' ändert die Liste, auf die beide Variablen verweisen.

Python-Variablen enthalten zwar eigentlich nur Verweise auf Werte, doch umgangssprachlich wird oft die Formulierung gebraucht, dass eine Variable einen Wert enthält.

Routineaufgaben mit Python automatisieren

Подняться наверх