Werte von Objekten in Python
Der Wert eines Objektes
Manchmal sollen verschiedene Objekte die gleiche Sache darstellen. Diese Sache wird dann als Wert jener Objekte bezeichnet.
Beispielsweise könnte es zwei unterschiedliche Geldscheine (Objekte) mit unterschiedlichen Seriennummern geben, die aber beide denselben Wert (beispielsweise 10 Euro) repräsentieren.
Wenn für zwei Ausdrücke »a« und »b« gilt, »a=b«, dann stehen sie für Objekte mit gleichem Wert.
(Es ist nicht immer möglich, den Wert eines Objektes als ein eigenes Objekt zu erhalten.)
Das folgende Protokoll zeigt zwei verschiedene Objekte »a« und »b« mit gleichem Wert (»a == b«). (Es muß allerdings nicht unbedingt unter jeder Python -Implementation dieses Verhalten zeigen.)
- Protokoll
a = 'ab'
b = 'a' + chr( 98 )
print( a )
'ab'
print( b )
'ab'
print( id( a )==id( b ))
False
print( a == b )
True
Der Wert einer Auswertung
Wir hatten schon früher den Begriff „Wert einer Auswertung“ kennengelernt.
Dieser Begriff sollte nicht mit dem jetzt eingeführten Begriff „Wert eines Objektes“ gleichgesetzt werden.
Der Wert einer Auswertung ist einfach das Ergebnis der Auswertung (es handelt sich dabei stets um ein Objekt).
Beispielsweise ist der Wert der Auswertung des Ausdrucks »2+3« ein Objekt, das den Wert «5» repräsentiert.
In diesem Kurs schreiben wir für das Objekt, welches der Wert eines Ausdrucks »a« ist auch ‹a›. Für den Wert jenes Objektes schreiben wir dann «a».
Lesehinweis
Oft ist es aber nicht so wichtig, diese genauen Unterscheidungen zu machen. Daher kann man trotzdem einfach weiterlesen, selbst wenn einem der Unterschied zwischen „»a«“, „›a‹“ und „«a»“ noch nicht verständlich geworden sein sollte.
Eindeutige Objekte
Für die drei speziellen Werte «True», «False» und «None» gibt es immer nur jeweils genau ein Objekt, das sie repräsentiert, nämlich das Objekt ›True‹, ›False‹ beziehungsweise ›None‹.
Ein Zahl, wie die Zahl Zwei, könnte durch mehrere Objekte repräsentiert werden, die alle den gleichen Wert «2» haben.
Identität und Gleichheit ⃗
Im folgenden Protokoll sind »b0« und »b1« zwei verschiedene Namen für zwei verschiedene Objekte (laut »id«), die aber beide denselben Wert (»==«) haben.
- Protokoll
a = "a"
b0 = a + "b"
b1 = a + "b"
b0 == b1
True
id( b0 )
35368552
id( b1 )
35368104
id( b0 )== id( b1 )
False
Dieses Beispiel muß nicht unbedingt mit jeder Python -Implementation nachvollziehbar sein, da eine Python -Implementation zwei identische Zeichenfolgen auch zu einem Objekt zusammenziehen könnte, wie in dem folgenden Beispiel.
- Protokoll
b0 = "ab"
b1 = "ab"
id( b0 )
35368384
id( b1 )
35368384
id( b0 )== id( b1 )
True
Werte und Objekte ⃗
Verschiedene Objekte können denselben Wert darstellen. Normalerweise gelten solche Objekte bei Vergleich mit »==« als gleichwertig.
Beispielsweise könnte es sein, daß das Numerale »5000« auf der linken Seite eines Vergleichs für ein anderes Objekt steht als das Numerale »5000« auf der rechten Seite. Auf jeden Fall gelten sie aber als gleichwertig.
- Auswertung
5000 == 5000
True
Der folgende Vergleich zweier lambda-Funktionen ergibt ›False‹.
- Auswertung
( lambda: 2 )==( lambda: 2 )
False
Die liegt daran, daß bei Vergleich von lambda-Funktionen geprüft wird, ob beide das gleiche Objekt sind. Oben stehen die beiden lambda-Ausdrücke aber für zwei verschiedene Objekte, obwohl beide Objekte die gleiche Berechnung durchführen. Jeder lambda-Ausdruck ergibt aber ein neues Objekt, also ein Objekt, das sich von allen anderen Objekten unterscheidet.
Es folgt noch ein anderes Beispiel, bei dem sich ›False‹ ergibt, obwohl beide Ausdrücke gleich sind – die Ausdrücke sind einander gleich, aber nicht gleichwertig !
- Auswertung
from random import random
random() == random()
False
Bindungen und Vergleiche ⃗
Nach der Bindung eines Objektes an einen Namen ist der Name zu allen dem Objekt gleichwertigen Objekten gleichwertig.
- Auswertung
x = 2
x == 2
True
- Auswertung
f =( lambda: 2 )
f == f
True
g = f
g == f
True
f ==( lambda: 2 )
False
- Auswertung
from random import random
x = random()
x == random()
False
»isinstance« im Vergleich mit »==« ⃗
»isinstance« sieht »True« als ein Exemplar der Klasse »int« an, da die Klasse von »True« (also »bool«) eine Unterklasse der Klasse »int« ist. Das heißt: »True« kann überall dort verwendet werden, wo ein ISBN int-Wert erwartet wird.
- Auswertung
isinstance( True, int )
True
Jedes Objekt kann als Typ jedoch nur eine Klasse haben, und die Klasse von »True« ist »bool« und nicht »int«.
- Auswertung
type( True )== int
False
In der Praxis braucht man »isinstance« und Typvergleiche mit »==« eher selten. Diese Möglichkeiten werden hier eher gezeigt, um das Typsystem von Python zu illustrieren.
Zitate *
- Zitat (leicht redaktionell bearbeitet) *
- “The chapter ‘Objects, values and types’ stated that objects have a value (in addition to type and identity).
- The value of an object is a rather abstract notion in Python: For example, there is no canonical access method for an object’s value. Also, there is no requirement that the value of an object should be constructed in a particular way, e.g., comprised of all its data attributes.
- Comparison operators implement a particular notion of what the value of an object is. One can think of them as defining the value of an object indirectly, by means of their comparison implementation. ”
- The Python Language Reference, Release 3.8.0a0