Klaus Mennward: Python Vergleichsoperator Frage

Hallo,

eine Frage: Der Term x == y vergleicht meines Wissens die Operanden nicht anhand ihres Wertes sondern ihrer Identität.

Die Identität wird ja mit der Funktion id() abgefragt.

a = 2
b = 2

id(a)
10088320

id(b)
10088320

Ich frage mich nun, warum 1 == 1.0 wahr ist. Die Identität von 1 und 1.0 ist logischerweise nicht die selbe ( in C ist 1 == 1.0 wahr, aber hier erscheint es mir einleuchtender).

Weiss das jemand? Vermutlich stimmt das mit der Identität nicht und ich habe hier altes, falsches Wissen. Konnte im interdings aber nichts finden.

Verwirrt Klaus

`

  1. Hallo

    eine Frage: Der Term x == y vergleicht meines Wissens die Operanden nicht anhand ihres Wertes sondern ihrer Identität.

    Nein, in Python testet == auf Gleichheit. is testet auf Identität.

    Ein Vergleich mit is kann allerdings überraschende Ergebnisse hervorbringen:

    # Ergibt True
    1 == 1
    
    # Ergibt True
    1 is 1
    
    
    # Ergibt True
    100000 == 10**5
    
    # Ergibt False
    100000 is 10**5
    

    Das liegt daran, dass Python bestimmte Werte im Speicher vorhält. Für kleine Integer zum Beispiel wird nicht jedesmal Speicherplatz belegt. Es wird einfach auf dieselbe Stelle verwiesen. Da is Referenzen vergleicht, ergibt das dann True. Bei Werten, die nicht gecached wurden, ergibt der Vergleich False.

    EDIT: Aus demselben Grund bekommst du von id() wie in deinem Beispiel mit der Zahl 2 dasselbe Ergebnis. Übergibst du größere Zahlen, zum Beispiel 1000, sieht das dann anders aus, da für diese Werte dann neuer Speicher belegt wird.

    Eigentlich kann einem dieses Implementierungsdetail aber auch egal sein: Wenn du Zahlen vergleichst, dann willst du in der Regel deren Wert vergleichen, also verwende ==.

    Viele Grüße,

    Orlok

    --
    „Dance like it hurts.
    Make love like you need money.
    Work when people are watching.“ — Dogbert