Verständnisfrage == oder is

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pumabuma
User
Beiträge: 10
Registriert: Dienstag 8. Oktober 2019, 12:57

Guten Tag zusammen,
ich habe eine wirkliche Basiswissenfrage und in den Beispielen im Netz klingt das auch immer total logisch. Aber bei Dingen die im Hintergrund passiert, z.B. Speicherorte, etc. stehe ich noch auf dem Schlauch.
Und zwar wollte ich kürzlich eine if-Abfrage machen.
Zu den Operatoren is und == habe ich das so verstanden, dass is für den Bezug auf das selbe Objekt und == für den Vergleich des reinen Wertes genutzt wird. Aber für die Anwendung habe ich noch nicht verstanden, wann ich was verwenden muss.

In meinem Projekt hatte ich ungefähr folgenden Aufbau in einer Schleife, die die Elemente einer Liste durchforstet. Ist jetzt mal stark vereinfacht auf die wesentlichen Kernaussagen, die Frage betreffend.
Grund für die if-Abfrage war, dass die Listenelemente eigentlich jeweils ein Wörterbuch sind(danke für den Tipp vom letzten mal!), und ich für das jeweilige Minimum, dazu gehörenden Werte mit ausgeben lassen möchte.
Also war mein Ansatz: wenn das ermittelte Minimum, zu dem Listenelement gehört, das gerade betrachtet wird und somit das selbe Objekt anspricht (???), dann gib mir die dazu gehörenden Daten mit aus. Wird das Minimum also beim nächsten Element nicht neu überschrieben, will ich die übrigend Daten dieses Listenelementes nicht wissen.
Mit == läuft es ohne Macken, bei is läuft es auch ohne Error gibt aber nicht die richtige Variable aus. Jetzt noch mal zur Frage, wie ist das mit diesem is nun zu verstehen?

Code: Alles auswählen

    liste0 = []
    minimum = 0 
    i = 0
    
    for i in liste0:
        minimum = min(minimum, i + 3)
        
        if minimum == i + 3 
            print(i)
            
    # oder lieber mit weiterer Variabel? Macht das einen Unterschied?

    for i in liste0:
        wert = i + 3  
        minimum = min(minimum, wert)
        
        if minimum == wert 
            print(i)

Beste Grüße und schon mal fettes Danke
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

`is` prüft, ob die Objekte identisch sind, bei Deinem Beispiel kommen die Zahlen aber auf unterschiedlichen Wegen zum gleichen Wert, sind also nicht die identischen Objekte, sondern haben nur den selben Wert.

`is` kann man selten sinnvoll einsetzen, und wird eigentlich außer bei `is None`-Vergleichen nicht eingesetzt.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pumabuma: In aller Regel ist ``==``/``!=`` das richtige, weil man eher selten wissen will ob man wirklich das *selbe* Objekt über zwei verschiedene Wege erreichen kann, sondern eher ob die beiden Objekte den gleichen Wert haben. Was ja auch der Fall ist wenn es tatsächlich das *selbe* Objekt ist. Aber umgekehrt gilt halt nicht zwingend, dass wenn der ``==``-Vergleich wahr ergibt, dass die Ausdrücke auf beiden Seiten tatsächlich zum *selben* Objekt ausgewertet werden.

Wo man ``is``/``is not`` nehmen kann und IMHO sollte sind ”Singletons”, also Werte von denen (nahezu) garantiert ist, dass es den Wert nur ein mal gibt. `None` ist da das übliche Beispiel. `None` ist ein Wert mit dem Typ `NoneType` und die Python-Dokumentation sagt, dass davon nur ein einziges Exemplar existiert.

Das gilt auch für `True` und `False`, aber da sollte man weder mit ``==``/``!=`` noch mit ``is``/``is not`` arbeiten, sondern den Wahrheitswert direkt, oder seine Negation mit ``not`` verwenden.

Zum gezeigten Quelltext wäre zu sagen das `i` vor der Schleife nicht an einen Wert gebunden werden muss und das `i` hier ein sehr schlechter Name ist. Bei `i` erwartet der Leser eine ganze Zahl die als Index verwendet wird.

Und die `0` bei `liste0` gehört da nicht hin. So einen Unsinn sollte man sich gar nicht erst angewöhnen.

Das mit `wert` macht semantisch eigentlich keinen Unterschied, man spart sich halt eine Rechnung und damit auch eine mögliche Fehlerquelle wenn man das ``i + 3`` mal ändern sollte und daran denken muss das überall zu ändern, wenn man es mehr als einmal im Quelltext stehen hat.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
pumabuma
User
Beiträge: 10
Registriert: Dienstag 8. Oktober 2019, 12:57

Okay danke.
Ja an meine Bezeichnungsmethode muss ich dringend arbeiten, hab ich schon gemerkt. Sham on me.
:)

Also wäre das "is" hier tatsächlich einfach gar nicht sinnvoll, weil ich richtige Zahlenwerte habe, die man leichter direkt vergleichen kann.
Angenommen ich möchte jetzt tatsächlich konkret prüfen, ob ich auf das selbe Objekt zugreife, was macht man dann? Oder passt das einfach überhaupt nicht auf dieses Beispiel? Könnte ich mich auch mit anfreunden.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pumabuma: Wenn man tatsächlich wissen will ob es das selbe Objekt ist, dann verwendet man ``is``. Dafür ist das ja da. Du müsstest dann aber auch erklären können warum Dir das wichtig ist, dass es sich um das selbe Objekt handelt, und es muss dann auch wie gewünscht funktionieren. Das wird es in dem Beispiel wohl eher nicht, denn ob es sich bei zweimal ``i + 2`` dann am Ende jeweils um das selbe Objekt handelt oder nicht garantiert halt niemand. Im Grunde kann man es *nicht* erwarten, aber die konkrete Python-Implementierung kann beide male das selbe Objekt liefern wenn sie möchte. Entweder immer, oder nur für bestimmte Werte von `i`. Ob das ``i + 3 is i + 3`` also `True` oder `False` ergibt, kann man nicht vorhersagen ohne zu wissen was der verwendete Interpreter damit genau macht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
pumabuma
User
Beiträge: 10
Registriert: Dienstag 8. Oktober 2019, 12:57

Ahhh! Gut, war jetzt noch mal eine zündende Aussage.
Besten Dank
Antworten