Seite 1 von 1
id()-Funktionsaufruf
Verfasst: Mittwoch 21. Februar 2007, 14:51
von Helex
Hio,
ich bin gerade im Kapitel über 'mutable' und 'immutable' Sequenzen angekommen und mit dem Funktionsaufruf id() kann ich zwei Objekte auf Gleichheit überprüfen.
Code: Alles auswählen
>>> a = [1,]
>>> a
[1]
>>> b = [1,]
>>> b
[1]
>>> id(a)
134776172
>>> id(b)
134776076
>>>
D.h. also, dass Listen zwar gleich sind, aber eine unterschiedliche Identität besitzen.
Bei Tupeln sieht es so aus:
Code: Alles auswählen
>>> f = ('Hallo')
>>> f
'Hallo'
>>> g = ('Hallo')
>>> g
'Hallo'
>>> id(f)
134775616
>>> id(g)
134775616
>>>
D.h. sie haben die gleiche id-Nummer. Nun meine Frage:Was beschreibt dieses id() (vielleicht eine Speichernummer) und da bei Tupeln die id gleich ist, wenn sie den gleichen Inhalt haben, heißt dass dann, das das Objekt zwei Namen hat oder zwei Referenzen besitzt.
Danke für die Antworten.
Gruß Helex
Verfasst: Mittwoch 21. Februar 2007, 15:15
von rayo
Hi
Beim zweiten fall musst du nach 'Hallo' noch ein Komma setzen, da diese nicht als Tuples gelten. Du hast also 2 Strings mit id() angeschaut.
Dafür bräuchte es diese bei den Listen nicht.
Gruss
Verfasst: Mittwoch 21. Februar 2007, 15:26
von Helex
@rayo,
danke für deine schnelle Antwort. Hast natürlich recht, aber in meinen Buch steht: Es gibt keine zwei gleichen unveränderbaren Objekte mit unterschiedlicher Identität.
Diese Aussage trifft wohl bei Strings zu, aber nicht für tupel, obwohl diese eigentlich auch unveränderbar sind
Verfasst: Mittwoch 21. Februar 2007, 15:42
von rayo
Hi
Da hat sich dein Buch wohl geirrt. Auch gleiche Strings können unterschiedliche ID haben.
Code: Alles auswählen
Help on built-in function id in module __builtin__:
id(...)
id(object) -> integer
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
Da steht ja auch, dass es die Speicheradresse ist.
Sogar Integer sind unterschidlich:
Code: Alles auswählen
>> a = 3**14
>> a
4782969
>> b = 4782969
>> id(a)
12681268
>> id(b)
12681520
>> a==b
True
Ich hab id sowieso noch nie gebraucht, wüsste auch nicht für was.
Gruss
Verfasst: Mittwoch 21. Februar 2007, 15:50
von Helex
@ rayo,
mal wieder vielen dank für deine Antwort, wie hast du die Hilfszeile bzw. Dokumentation aufgerufen? Dann könnte man sich ja auch so alle relevanten Sachen erklären lassen...
Verfasst: Mittwoch 21. Februar 2007, 15:52
von rayo
Hi Helex
Ganz eifach mit:
Funktioniert mit fast allem
Gruss
Verfasst: Mittwoch 21. Februar 2007, 15:56
von Helex
@rayo,
du hast mir heute schon eine Menge beigebracht vielen dank

. Aber vieleicht fällt mir ja noch ein praktischer Nutzen dieser Funktion ein und in der hilfe steht ja auch, dass es die Speicheradresse des Objektes zurück gibt.
... vielleicht braucht man das ja, um bei eventuellen Stack-Overflow speicher frei zu räumen, hab ich nämlich in IDLE gesehen, dass es da so etwas gibt.
Aber ich kann mich ja auch komplett irren!

Verfasst: Sonntag 25. Februar 2007, 03:17
von Leonidas
Helex hat geschrieben:... vielleicht braucht man das ja, um bei eventuellen Stack-Overflow speicher frei zu räumen, hab ich nämlich in IDLE gesehen, dass es da so etwas gibt.
Nein.
Mit ``id()`` prüfst du jediglich ob Objekte die gleiche Identität haben, also ob das Objekt auf welches der Name zeigt das gleiche ist. Wenn also die zwei Namen ``f`` und ``g`` auf das gleiche String-Objekt zeigen heißt das lediglich, dass der Python-Interpreter optimiert und statt zwei völlig identische Objekte im Speicher anzulegen bei ``g`` einfach auf den ersten String wieder zurückgreift, statt sinnlos Speicher zu verschwenden.