Die Bindungsanweisung in Python
Einführendes Beispiel
Durch die Ausführung der Bindungsanweisung »x = 2« wird der gewöhnliche Bezeicher »x« an dasjenige Objekt gebunden, welches die Auswertung des Ausdrucks auf der rechten Seite des Gleichheitszeichens ergibt.
- Protokoll (Anfang)
x = 2
Wenn der Name »x« direkt danach ausgewertet wird, so ergibt sich das Objekt, an das er gebunden ist.
- Protokoll (Fortsetzung)
x
2
dir()
[ … 'x']
In vielen Fällen kann man so tun, als ob ein Name, der an ein Objekt gebunden ist, das Objekt selber sei.
Ein durch einen Bindungsanweisung erzeugter Name wird in die Bindungstabelle des Moduls, zu dem die Bindungsanweisung gehört, eingetragen. Ein Aufruf von »(dir)« ohne Argumente zeigt die Namen aus dem aktuellen Modul, und damit auch einen durch eine Bindungsanweisung erzeugte Namen, an.
- Protokoll
dir()
[ … 'x']
Ein Name wird auch Variable genannt (The Python Language Reference, Release 3.7.0a1; 4.2.1p4).
Wir hatte vorher schon from-Importe als Möglichkeiten kennengelernt, Einträge in der Bindungstabelle anzulegen.
Die beiden folgenden Anweisungen bewirken also in der Regel (bis auf vielleicht kleinste Abweichungen) dieselbe Änderung:
- Anweisung
from math import pi
- Anweisung
pi = 3.1415926535897932384626433832795029
Beispiel
- Bindung
x = 5000
- Auswertung
x == 5000
True
Syntax
Eine Bindungsanweisung besteht aus einem gewöhnlichen Bezeichner, einem Gleichheitszeichen »=« und einem Ausdruck.
- Syntaxdiagramm (vereinfacht)
Bindungsanweisung
.--------------------------. .-. .----------.
--->| gewoehnlicher Bezeichner |--->( = )--->| Ausdruck |--->
'--------------------------' '-' '----------'Anweisung
.---------------------------.
---.--->| Auswertungsanweisung |---.--->
| '---------------------------' |
| .---------------------------. |
'--->| from-Importanweisung |---'
| '---------------------------' |
| .---------------------------. |
'--->| Bindungsanweisung |---'
'---------------------------'
Anweisungen und Ausdrücke
Es ist typisch für viele Programmiersprachen, daß Ausdrücke in Anweisungen vorkommen können, aber fast nie Anweisungen in Ausdrücken. Insofern kann man sich Ausdrücke als kleinere Bausteine der Programmiersprache vorstellen und Anweisungen als etwas größere Bausteine, die auf den Ausdrücken aufbauen.
Während die Auswertung eines Ausdrucks immer Wert ergibt, hat die Ausführung einer Anweisung nie einen Wert.
Sowohl die Auswertung eines Ausdrucks als auch die Ausführung einer Anweisung kann eine Änderung hervorrufen.
Vereinfacht gesagt stehen Ausdrücke für Werte und Anweisungen für Änderungskommandos, jedoch kann – davon abweichend – auch die Auswertung eines Ausdrucks eine Änderung hervorrufen.
Semantik ⃖
Jedes Modul verfügt über eine Bindungstabelle, welche zu jedem Namen das Objekt enthält, an welches er gebunden ist.
Bei der Ausführung einer Bindungsanweisung wird zunächst ihr Ausdruck ausgewertet. Diese Auswertung ergibt ein Objekt.
Anschließend wird ein Attribut zur Bindungstabelle des Moduls hinzugefügt, der den Namen und das Objekt enthält.
Falls der Name in der Bindungstabelle des Moduls der Anweisung zuvor schon an etwas gebunden war, geht diese vorherige Bindung bei der Herstellung der neuen Bindung verloren.
Falls der Name später als Ausdruck verwendet wird, wird sein Wert dann der Bindungstabelle des Moduls entnommen.
Im Gegensatz zur Auswertungsanweisung erzeugt die Bindungsanweisung von sich aus keine Ausgabe.
Mehrfache Bindungen eines Objektes
An ein und dasselbe Objekt können mehrere Namen gebunden werden, die man in diesem Zusammenhang auch „Ziele“ nennt.
- Protokoll
b = True
d = True
b
True
d
True
b is d
True
Oben wurden die Ziele »b« und »d« an das Objekt ›True‹ gebunden.
»b« und »d« sind nun zwei verschiedene Namen für das gleiche Objekt.
- Zitat
- Assignment statements in Python do not copy objects, they create bindings between a target and an object.
- The Python Library Reference, Release 3.8.0a0, section 8.10
Umbindungen
Bei einer erneuten Bindung an einen Bezeichner, der schon an ein Objekt gebunden ist, wird die bisherige Bindung durch eine neue Bindung ersetzt.
- Protokoll
x = 2
x = 'Ich war eine 2.'
x
'Ich war eine 2.'
Der gewöhnliche Bezeichner »x« war zunächst an das Objekt ›2‹ gebunden. Nach der Auswertung des Ausdrucks »x = 'Ich war eine 2.'« ist er aber nun an das Objekt ›'Ich war eine 2.'‹ gebunden.
Die Grundstrich-Variable ⃗
Durch ein Zuweisung (oder andere Anweisungen, die keine Auswertungsanweisungen sind) wird die Grundstrichvariable normalerweise nicht verändert.
- Protokoll
2 + 3
5
x = 4
_
5
Die Grundstrichvariable kann aber auf der linken Seite der Zuweisung verwendet werden.
- Protokoll
2 + 3
5
_ = 4
_
4
Übungsfragen
? Übungsfrage ⃖
Welche Ausgabe erzeugt die Ausführung der folgende Anweisung?
- Anweisung
x = 2
? Übungsfrage ⃖
Welche Ausgabe erzeugt die letzte Zeile der folgende Konsoleneingabe?
- Konsoleneingabe
x = 2
x + 1
? Übungsfrage ⃖
Welche Ausgabe erzeugt die letzte Zeile der folgende Konsoleneingabe?
- Konsoleneingabe
x = 2
x = 2 * x
x
Übungsaufgaben
Bei allen Übungsaufgaben dürfen ab jetzt beliebig viele benannte Hilfsobjekte als Teil der Lösung angelegt werden.
/ Übungsaufgabe
Schreiben Sie einen Quelltext, der den Wert des Namens »v« um «7» erhöht.
- Es kann davon ausgegangen werden, daß der Name zunächst an ein int-Objekt zwischen «0» und «1000» gebunden ist.
- Der Quelltext der Lösung soll den Wert des Namens »v« um «7» erhöhen, egal welchen Wert der Name zuvor hatte.
- Der Quelltext der Lösung darf eine Zeile oder mehrere Zeilen umfassen.
- Wenn der Quelltext der Lösung zweimal hintereinander unverändert ausgeführt wird, dann sollte dies den Wert des Namens also um «14» erhöhen.
- Beispielprotokoll
v = 20
- 〈Ihre Lösung 〉
v
27
- Beispielprotokoll
v = 30
- 〈Ihre Lösung 〉
v
37
- Beispielprotokoll
v = 20
- 〈Ihre Lösung 〉
- 〈Ihre Lösung 〉
v
34