id()-Funktionsaufruf

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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Mittwoch 21. Februar 2007, 14:51

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Mittwoch 21. Februar 2007, 15:15

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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Mittwoch 21. Februar 2007, 15:26

@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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Mittwoch 21. Februar 2007, 15:42

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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Mittwoch 21. Februar 2007, 15:50

@ 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...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Mittwoch 21. Februar 2007, 15:52

Hi Helex

Ganz eifach mit:

Code: Alles auswählen

help(id)
Funktioniert mit fast allem ;)

Gruss
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Mittwoch 21. Februar 2007, 15:56

@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:
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 25. Februar 2007, 03:17

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten