GC openbook falsch mit == und 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
desky
User
Beiträge: 4
Registriert: Dienstag 12. Mai 2009, 15:57
Wohnort: NRW

Guten Abend zusammen :)

Ich bin neu hier im Forum, sowie auch neu in Python =)
Derzeit versuche ich mich an dem "openbook" von Galileo Computing und bin gerade beim Kapitel Basisdatentypen.

Jetzt habe ich hier eine Gegenüberstellung von zwei Scripten(?!) Jedoch bekomme ich eine andere Ausgabe wie es laut Buch eigentlich der Fall sein sollte :?

Also erstmal hier der Abschnitt aus dem Buch:
Wenn man beide Indizes ausspart (s[:]), lässt sich auch eine echte Kopie der Sequenz erzeugen, weil dann alle Elemente vom ersten bis zum letzten kopiert werden. Beachten Sie bitte die unterschiedlichen Ergebnisse der beiden folgenden Code-Ausschnitte:

>>> s1 = "Kopier mich!"
>>> s2 = s1
>>> s1 == s2
True
>>> s1 is s2
True

Wie erwartet verweisen s1 und s2 auf dieselbe Instanz, sind also identisch. Anders sieht es bei dem nächsten Beispiel aus, bei dem eine echte Kopie von "Kopier mich!" im Speicher erzeugt wird. Dies zeigt sich beim Identitätsvergleich mit is:

>>> s1 = "Kopier mich!"
>>> s2 = s1[:]
>>> s1 == s2
True
>>> s1 is s2
False
Das erste Beispiel ist ok, da bekomme ich auch bei beidem ein True. Doch beim zweiten Beispiel erhalte ich selbst beim Vergleich mit "is" ein True.

Irgendwas kann da ja nicht passen oder? Wäre super wenn mir das jemand erklären kann wie es dazu gekommen ist.


Vielen Dank für Hilfe schon einmal im Voraus :D
mfg desky
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Bei unveränderlichen Typen ist es ziemlich egal ob man sie kopiert oder nicht, allerdings passiert letzteres weil es eben effizienter ist. Das ist aber kein garantiertes Verhalten.
desky
User
Beiträge: 4
Registriert: Dienstag 12. Mai 2009, 15:57
Wohnort: NRW

Vielen Dank für Deine Antwort :D
Aber ist "Kopier mich!" nicht eine Variable? Variablen sind doch mutable, also veränderbar, oder nicht?
DasIch hat geschrieben:...allerdings passiert letzteres weil es eben effizienter ist...
Was meinst du, und wieso ist es effizienter?
DasIch hat geschrieben:...Das ist aber kein garantiertes Verhalten.
Welches Verhalten ist nicht garantiert? Ob er True oder False zeigt? Was könnte denn im Bezug auf diesem Beispiel denn noch als Ausgabe kommen?


mfg desky
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Code: Alles auswählen

>>> s1 = [1, 2, 3, 4]
>>> s2 = s1[:]
>>> s1 == s2
True
>>> s1 is s2
False
Nur als Beispiel zwischen mutables und nicht mutables. Bei unveränderlichen Typen ist es nicht eindeutig, ob eine Referenz gleicht oder nicht... Hier noch ein Beispiel...

Code: Alles auswählen

>>> i1 = 2
>>> i2 = 2
>>> i1 == i2
True
>>> i1 is i2
True
>>> i1 = 1241124143124
>>> i2 = 1241124143124
>>> i1 == i2
True
>>> i1 is i2
False
is sollte nur verwendet werden, wenn man tatsächlich auf perfekte Gleichheit, einschließlich gleicher Referenz und sowas, testen will. Das ist bei None recht wichtig, weil None ja'n Singleton ist.

(...mhm, in diesem Post sind'n paar Fakten, die ich nochmal nachschlagen müsste... also alles ohne Gewähr oO Nicht gleich aufhängen, wenn ich irgendwas falsches gesagt habe.)


Edit: Achja, fällt mir ein - lies das OpenBook nicht. Das offizielle Tutorial, oder a byte of Python oder sowas... alles wesentlich besser. Wenn du wissen möchtest wieso -> Die Suchfunktion des Forums. Galileocomputing Openbook oder so... Wirst schon was finden.
BlackJack

@desky: Mit dem Begriff "Variable" muss man ein wenig vorsichtig sein. Du kannst den gleichen Namen an andere Objekte binden sooft Du magst, aber es gibt Objekte, wie zum Beispiel Zeichenketten, die kann man nicht verändern. Und wenn man von solchen eine 1:1 Kopie erstellt, würde man nur Speicher verschwenden, darum darf Python auch beim Kopieren das gleiche Objekt liefern, statt ein neues zu erstellen. Das muss aber nicht so sein. Darum ist in diesem Fall nicht garantiert, ob bei dem Identitätsvergleich mit ``is`` nun `True` oder `False` herauskommt.

Bei Listen sieht das anders aus, die kann man verändern und da macht es dann einen grossen Unterschied, ob man wirklich eine Kopie bekommt, oder nicht.
desky
User
Beiträge: 4
Registriert: Dienstag 12. Mai 2009, 15:57
Wohnort: NRW

Danke für die guten Erklärungen :)
Auch wenn ich immer von der Mietzelkatze abgelenkt wurde :P

@BlackVivi: Hatte mich schon ein wenig im Forum um geguckt und den Tutorial-Thread gelesen wo das openbook so nieder gemacht wurde, nur ist es schade, das die neue Version von "A Byte of Python" in englisch ist und die aktuellste Übersetzung von "A Byte of Python" vermittelt leider eine viel ältere Version. Dachte das es da zu Konflikten kommen kann.
BlackJack hat geschrieben:...Und wenn man von solchen eine 1:1 Kopie erstellt, würde man nur Speicher verschwenden, darum darf Python auch beim Kopieren das gleiche Objekt liefern, statt ein neues zu erstellen. Das muss aber nicht so sein. Darum ist in diesem Fall nicht garantiert, ob bei dem Identitätsvergleich mit ``is`` nun `True` oder `False` herauskommt...
Also verstehe ich das richtig, wenn ein Objekt noch im Speicher vorhanden ist, wird es aus dem Speicher geholt und ist somit True, doch ist die Kopie nicht mehr im Speicher, so erhält man, weil er den String neu erstellt, ein False?!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

desky hat geschrieben:Also verstehe ich das richtig, wenn ein Objekt noch im Speicher vorhanden ist, wird es aus dem Speicher geholt und ist somit True, doch ist die Kopie nicht mehr im Speicher, so erhält man, weil er den String neu erstellt, ein False?!
Das Objekt ist das gleiche, da wird an dieser Stelle nichts kopiert. Es bekommt einfach nur einen zusätzlichen Namen, ``s2`` an den es gebunden wird (somit wird auch sichergestellt, dass das Objekt immer noch existiert, selbst wenn der Name ``s1`` irgendwo gelöscht werden sollte).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

is gibt true zurueck, wenn zwei Namen auf das gleiche Objekt im Speicher zeigen.

Wie BlackJack sagte, bei unveraenderbaren Objekten ist es in der Sprache Python nicht festgelegt, ob beim Kopieren die Referenz auf das gleiche oder ein neues Objekt zurueckgegeben wird, da es keine weiteren praktischen Auswirkungen hat. Der cpython-Interpreter ist (manchmal?) schlau genug, zu erkennen, dass er unveraenderbare Objekte nicht zu kopieren braucht. Darauf verlassen solltest du dich nicht.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
desky
User
Beiträge: 4
Registriert: Dienstag 12. Mai 2009, 15:57
Wohnort: NRW

Achsoo :wink:
Ok, vielen Dank für eure Hilfe :) Werde jetzt noch einmal von vorne beginnen mit der deutschen Übersetzung von "A Byte of Python" und dann hoffe ich noch ein paar andere Dinge, welche ich beim GC openbook nicht komplett verstanden habe, besser zu verstehen!


mfg desky
Antworten