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:

Code: Alles auswählen

help(id)
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 :D . 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! :shock:

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.