Ich habe die Python 2-Dokumente gelesen und die id()
Funktion bemerkt :
Gibt die "Identität" eines Objekts zurück. Dies ist eine Ganzzahl (oder lange Ganzzahl), die für dieses Objekt während seiner Lebensdauer garantiert eindeutig und konstant ist. Zwei Objekte mit nicht überlappenden Lebensdauern können denselben id () -Wert haben.
CPython-Implementierungsdetail: Dies ist die Adresse des Objekts im Speicher.
Also habe ich id()
mit einer Liste experimentiert :
>>> list = [1,2,3]
>>> id(list[0])
31186196
>>> id(list[1])
31907092 // increased by 896
>>> id(list[2])
31907080 // decreased by 12
Was ist die von der Funktion zurückgegebene Ganzzahl? Ist es auch für Speicheradressen in C? Wenn ja, warum entspricht die Ganzzahl nicht der Größe des Datentyps?
Wann wird id()
in der Praxis angewendet?
Antworten:
Ihr Beitrag stellt mehrere Fragen:
Es ist " eine Ganzzahl (oder lange Ganzzahl), die für dieses Objekt während seiner Lebensdauer garantiert eindeutig und konstant ist. " (Python Standard Library - Integrierte Funktionen) Eine eindeutige Zahl. Nicht mehr und nicht weniger. Stellen Sie sich das als Sozialversicherungsnummer oder Mitarbeiter-ID für Python-Objekte vor.
Konzeptionell ja, da beide zu Lebzeiten garantiert einzigartig in ihrem Universum sind. In einer bestimmten Implementierung von Python ist dies tatsächlich die Speicheradresse des entsprechenden C-Objekts.
Weil eine Liste kein Array ist und ein Listenelement eine Referenz, kein Objekt.
Fast nie.
id()
(oder gleichwertig) wird imis
Operator verwendet.quelle
Das ist die Identität des Ortes des Objekts im Speicher ...
Dieses Beispiel könnte Ihnen helfen, das Konzept ein wenig besser zu verstehen.
Diese zeigen alle auf dieselbe Stelle im Speicher, weshalb ihre Werte gleich sind. Im Beispiel
1
wird nur einmal gespeichert, und alles andere, auf1
das verwiesen wird, verweist auf diesen Speicherort.quelle
id()
Gibt zwar die Adresse des Objekts zurück, auf das verwiesen wird (in CPython), aber Ihre Verwirrung ergibt sich aus der Tatsache, dass sich Python-Listen stark von C-Arrays unterscheiden. In einer Python-Liste ist jedes Element eine Referenz . Was Sie also tun, ist diesem C-Code viel ähnlicher:Mit anderen Worten, Sie drucken die Adresse aus der Referenz und nicht eine Adresse in Bezug auf den Speicherort Ihrer Liste.
In meinem Fall hat sich die
id()
Funktion als nützlich erwiesen, um undurchsichtige Handles zu erstellen, die beim Aufrufenpython
von C zum C-Code zurückkehren . Auf diese Weise können Sie das Objekt mit einem Wörterbuch leicht von seinem Handle aus nachschlagen, und es ist garantiert eindeutig.quelle
Robs Antwort (die meisten stimmten oben) ist richtig. Ich möchte hinzufügen, dass die Verwendung von IDs in einigen Situationen nützlich ist, da hiermit Objekte verglichen und festgestellt werden können, welche Objekte auf Ihre Objekte verweisen.
Letzteres hilft Ihnen normalerweise beim Debuggen von seltsamen Fehlern, bei denen veränderbare Objekte als Parameter für Klassen übergeben und lokalen Variablen in einer Klasse zugewiesen werden. Durch das Mutieren dieser Objekte werden vars in einer Klasse mutiert. Dies äußert sich in einem seltsamen Verhalten, bei dem sich mehrere Dinge gleichzeitig ändern.
Vor kurzem hatte ich dieses Problem mit einer Python / Tkinter-App, bei der das Bearbeiten von Text in einem Texteingabefeld den Text in einem anderen während der Eingabe geändert hat :)
Hier ist ein Beispiel, wie Sie die Funktion id () verwenden können, um zu verfolgen, wo sich diese Referenzen befinden. Auf jeden Fall ist dies keine Lösung, die alle möglichen Fälle abdeckt, aber Sie haben die Idee. Wieder werden IDs im Hintergrund verwendet und der Benutzer sieht sie nicht:
AUSGABE:
Unterstriche in Variablennamen werden verwendet, um Namenskollisionen zu verhindern. Funktionen verwenden das Argument "fromwhere", damit Sie ihnen mitteilen können, wo sie mit der Suche nach Referenzen beginnen sollen. Dieses Argument wird von einer Funktion gefüllt, die alle Namen in einem bestimmten Namespace auflistet. Globals () ist eine solche Funktion.
quelle
Ich beginne mit Python und verwende id, wenn ich die interaktive Shell verwende, um zu sehen, ob meine Variablen derselben Sache zugewiesen sind oder ob sie nur gleich aussehen.
Jeder Wert ist eine ID, bei der es sich um eine eindeutige Nummer handelt, die sich darauf bezieht, wo er im Speicher des Computers gespeichert ist.
quelle
Wenn Sie Python 3.4.1 verwenden, erhalten Sie eine andere Antwort auf Ihre Frage.
kehrt zurück:
Die Ganzzahlen
-5
,256
die eine konstante ID haben sollen, und wenn sie mehrmals gefunden werden, ändert sich ihre ID nicht, im Gegensatz zu allen anderen Zahlen davor oder danach, die jedes Mal unterschiedliche IDs haben, wenn Sie sie finden. Die Zahlen von-5
bis256
haben IDs in aufsteigender Reihenfolge und unterscheiden sich um16
.Die von der
id()
Funktion zurückgegebene Nummer ist eine eindeutige ID für jedes im Speicher gespeicherte Element und entspricht analog dem Speicherort in C.quelle
Die Antwort ist so gut wie nie. IDs werden hauptsächlich intern in Python verwendet.
Der durchschnittliche Python-Programmierer wird wahrscheinlich nie
id()
in seinem Code verwenden müssen.quelle
id()
ziemlich viel. Zwei Anwendungsfälle auf den ersten Blick: Ein (handgerolltes, ad-hoc) Identitätsdiktat und ein Brauchrepr()
für ein Objekt, bei dem Identität wichtig ist, die Standardeinstellungrepr
jedoch nicht angemessen ist.Der
is
Operator prüft damit, ob zwei Objekte identisch sind (im Gegensatz zu gleich). Der tatsächliche Wert, von dem zurückgegeben wird,id()
wird so gut wie nie für irgendetwas verwendet, da er keine wirkliche Bedeutung hat und plattformabhängig ist.quelle
Dies ist die Adresse des Objekts im Speicher, genau wie im Dokument angegeben. Es sind jedoch Metadaten angehängt. Zum Speichern der Metadaten werden Eigenschaften des Objekts und der Speicherort im Speicher benötigt. Wenn Sie also Ihre Variable namens list erstellen, erstellen Sie auch Metadaten für die Liste und ihre Elemente.
Wenn Sie also kein absoluter Guru in der Sprache sind, können Sie die ID des nächsten Elements Ihrer Liste nicht anhand des vorherigen Elements bestimmen, da Sie nicht wissen, was die Sprache zusammen mit den Elementen zuweist.
quelle
id()
. Sie müssen mit den betreffenden Speichermanagern (Plural!) Gut vertraut sein, ihren genauen Status zu einem bestimmten Zeitpunkt kennen und die genaue Reihenfolge kennen, in der die Objekte zugewiesen wurden. Mit anderen Worten: Wird nicht passieren.Ich habe eine Idee, den Wert von
id()
bei der Protokollierung zu verwenden.Es ist billig zu bekommen und es ist ziemlich kurz.
In meinem Fall verwende ich Tornado und
id()
möchte einen Anker haben, um Nachrichten zu gruppieren, die über eine Datei nach Web-Socket verteilt und gemischt sind.quelle
Ab Python 3 wird die ID einem Wert zugewiesen, der keine Variable ist. Dies bedeutet, dass, wenn Sie zwei Funktionen wie unten erstellen, alle drei IDs gleich sind.
quelle
Ich bin etwas spät dran und werde über Python3 sprechen. Betrachten Sie das folgende Beispiel, um zu verstehen, was id () ist und wie es (und Python) funktioniert:
Sie müssen alles auf der rechten Seite als Objekte betrachten. Jedes Mal, wenn Sie eine Zuweisung vornehmen, erstellen Sie ein neues Objekt und das bedeutet eine neue ID. In der Mitte sehen Sie ein "wildes" Objekt, das nur für die Funktions-ID (1000) erstellt wird. Die Lebensdauer gilt also nur für diese Codezeile. Wenn Sie die nächste Zeile überprüfen, sehen Sie, dass beim Erstellen der neuen Variablen x dieselbe ID wie bei diesem Platzhalterobjekt vorhanden ist. Es funktioniert so ziemlich wie eine Speicheradresse.
quelle
Seien Sie vorsichtig (bezüglich der Antwort unten) ... Das stimmt nur, weil 123 zwischen -5 und 256 liegt ...
quelle