Datentypen und Variablen
Einführung
Auch wenn man Variablen und Datentypen von anderen Programmiersprachen bereits zur Genüge zu kennen glaubt, sollte man dieses Kapitel dennoch zumindest überfliegen, denn einiges ist eben doch anders in Python.Zahlen
Python kennt vier eingebaute (built-in) Datentypen für Zahlen:
- Ganzzahl (Integer)
z.B. 4321
vorangestellte 0 bedeutet Oktalzahl und
vorangestelltes 0x bedeutet Hexzahl
- lange Ganzzahl
Sie können beliebig lang werden
Sie werden mit einem l am Anfang bzw. L am Ende bezeichnet.
- Fließkommazahlen
Zahlen der Form 3.14159 oder 17.3e+02
- komplexe Zahlen
z.B. 1.2+3j
Strings
Ein String, oder Zeichenkette, kann man als eine Sequenz von einzelnen Zeichen sehen.
Strings können unter Benutzung von
- einzelnen Anführungszeichen (')
'Dies ist ein String mit einfachen Quotes' - doppelten Anführungszeichen (")
"Mayers' Dackel heißt Waldi" - dreifachen Anführungszeichen (''') oder (""")
'''String in dreifachen Anführungszeichen können auch über mehrere Zeilen gehen und 'einfache' und "doppelte" Anf.zeichen enthalten.'''
Ein paar String-Funktionen:
- Concatenation
"Hello" + "World" -> "HelloWorld" - Repetition
"*-*" * 3 -> "*-**-**-*" - Indexing
"Python"[0] -> "P" - Slicing
"Python"[4:6] -> "on" - Size
len("Python") -> 6
- \ Zeilenfortsetzung
- \\ Rückwärtsschrägstrich
- \' Einzelnes Anführungszeichen
- \" Doppeltes Anführungszeichen
- \a Glocke
- \b Rückschritt
- \e Ausmaskieren
- \0 Null
- \n Zeilenvorschub (linefeed, LF)
- \v Vertikaler Tabulator
- \t Horizontaler Tabulator
- \r Wagenrücklauf (carriage return, CR)
- \f Seitenvorschub
- \0XX Oktaler Wert
- \xXX Hexadezimaler Wert
Beispiel:
r"\n bewirkt einen Zeilenvorschub"
Variablen
Eine Variable im allgemeinsten Sinne ist einfach ein Behälter (Container) zur Aufbewahrung von bestimmten Werten, also z.B. Strings oder Zahlen. Man kann im Verlauf des Programms auf diese Variablen, oder genauer auf den Wert ihres Inhaltes zugreifen, oder ihnen einen neuen Wert zuweisen.
In den meisten Programmiersprachen, wie z.B. C, ist es so, dass eine
Variable einen festen Speicherplatz bezeichnet, in dem Werte eines bestimmten
Datentyps abgelegt werden können. Während des Programmlaufes kann sich der
Wert der Variable ändern, aber die Wertänderungen müssen vom gleichen Typ
sein. Also man kann nicht in einer Variable zu einem bestimmten Zeitpunkt eine
Integerzahl gespeichert haben und dann diesen Wert durch eine Fließkommazahl
überschreiben. Ebenso ist der Speicherort der Variablen während des gesamten
Laufes konstant, kann also nicht mehr geändert werden. In Sprachen wie C wird
der Speicherort bereit durch den Compiler fixiert.
In Python sieht dies anders aus. Zunächst einmal bezeichnen Variablen in
Python keinen bestimmten Typ und deshalb benötigt man auch in Python keine
Typdeklaration. Benötigt man im Programm bespielsweise eine Variable i mit dem
Wert 42, so erreicht man dies einfach mit der folgenden Anweisung:
i = 42Obige Anweisung darf man nicht als mathematisches Gleichheitszeichen sehen, sondern als "der Variablen i wird der Wert 42 zugewiesen", d.h. der Inhalt von i ist nach der Zuweisung 42. Man kann diesen Wert der Variablen auch, wie man im folgenden Beispiel sieht, anschließend ändern:
>>> i = 42 >>> i = i + 1 >>> print i 43 >>>
Wechselnde Speicherorte
In Python kann eine Variable, wie bereits gesagt, sofort ohne Deklaration des Datentyps verwendet werden.Der Datentyp ist in Python nicht an die Variable, sondern an den Wert gebunden, was impliziert, dass sich der Typ zur Laufzeit ändern kann.
i = 42 # Datentyp ist integer (implizit) i = 42 + 0.11 # Typ ändert sich zu float i = "fourty" # und jetzt ein StringPrinzipiell wird sich vorigen Fall, wobei das natürlich implementierungsabhängig ist, der Speicherort für die Variable i ändern. Der Interpretor kann bei der Anweisung "i = 42" den Wert als Integer abspeichern, muss aber bei der Anweisung "i = 42 + 0.11" einen neuen Ort für eine Float-Zahl anlegen. Für i = "fourty" muss er in einen String gewandelt werden.
Achtung: Als Anwender braucht man dies eigentlich nicht zu wissen, da ja alles automatisch geschieht!
Betrachten wir nun folgenden Python-Code:
>>> x = 3 >>> y = x >>> y = 2
Intuitiv würde man davon ausgehen, dass Python zunächst für x einen
Speicherort wählt und dort das Objekt (Zahl) 3 abspeichert. Anschließend wird
der Variablen y der Wert von x zugewiesen. In C und vielen anderen
Programmiersprachen würde auch für y ein eigener Speicherort bestehen, in dem
nun die Zahl 3 hineingeschrieben würde. Python geht anders vor: x ist eine
Variable mit dem Objekt 3 und y ist eine Variable mit dem "selben" (nicht
"gleichen") Objekt. x und y "zeigen" auf das gleiche Objekt. In der letzten
Zeile wird y nun der Wert 2 zugewiesen, jetzt muss ein neues Objekt angelegt
werden und y "zeigt" auf einen neuen Speicherort. (Anm: Dieses eben verwendete
"zeigen" sollte von C-Programmierern keinesfalls mit den unter C verwendeten
Pointern verwechselt werden.)
Es stellt sich nun die Frage, wie man das oben gesagte überprüfen kann. Dazu bietet sich die Identitätsfuntion id() an. Die Identität einer Instanz dient dazu, sie von allen anderen Instanzen zu unterscheiden. Die Identität ist eine Ganzzahl, und sie ist innerhalb eines Programmes eindeutig. Die Identitätsfunktion id() liefert die Identität. So kann man prüfen, ob es sich um eine bestimmte Instanz handelt und nicht nur um eine mit dem gleichen Wert und Typ. Wir geben nochmals das obige Beispiel ein, lassen uns aber jeweils die Identität ausgeben:
>>> x = 3 >>> print id(x) 157379912 >>> y = x >>> print id(y) 157379912 >>> y = 2 >>> print id(y) 157379924 >>> print id(x) 157379912 >>>Wir stellen fest, dass sich die Identität erst ändert, nachdem wir y einen neuen Wert zugewiesen haben. Die Identität von x bleibt gleich, d.h. der Speicherort von x wird nicht geändert.
Besonderheiten bei Strings
Einen besonderen Effekt können wir bei Strings feststellen. Im folgenden Beispiel wollen wir dies veranschaulichen. Dazu benötigen wir noch den "is"-Operator. Sind a und b zwei Strings, dann prüft "a is b", ob a und b die gleiche Identität (Speicherort) haben. Wenn "a is b" gilt, dann gilt auch "a == b". Aber wenn "a == b" gilt, dann gilt natürlich nicht notwendigerweise auch "a is b"!Nun wollen wir untersuchen, wie Strings in Python abgespeichert werden. Im folgenden Beispiel, erkennen wir, dass a und b sich den gleichen Speicherort teilen, obwohl wir diesmal keine Zuweisung der Art "b = a" verwendet haben:
>>> a = "Linux" >>> b = "Linux" >>> a is b TrueWie sieht es jedoch aus, wenn der verwendete String länger ist? Im folgenden verwenden wir als String den längsten Ortsnamen der Welt. Eine Gemeinde mit etwas mehr als 3000 Einwohnern im Süden der Insel Anglesey in der gleichnamigen Grafschaft im Nordwesten von Wales:
>>> a = "Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch" >>> b = "Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch" >>> a is b TrueAber Vorsicht ist geboten, denn was für eine Gemeinde in Wales funktioniert, schlägt beispielsweise für Baden-Württemberg fehl:
>>> a = "Baden-Württemberg" >>> b = "Baden-Württemberg" >>> a is b False >>> a == b TrueAlso an der geographischen Lage kann es nicht liegen, wie man im folgenden Beispiel sieht. Es sieht vielmehr so aus, als dürften keine Sonderzeichen oder Blanks im String vorkommen.
>>> a = "Baden!" >>> b = "Baden!" >>> a is b False >>> a = "Baden1" >>> b = "Baden1" >>> a is b True
Die Priesterinnen von Delphi hießen nach der Schlange Pythien.
This topic in English / Englische Version: