`Id`-Funktion in Python 2.7,` is`-Operator, Objektidentität und benutzerdefinierte Methoden [duplizieren]

Diese Frage hat hier schon eine Antwort:

  • Pythongebundenen und ungebundenen Methodenobjekt 2 Antworten

Die Ergebnisse aus dem Code unten in Python 2.7 schlugen mich als Widerspruch. Der Operator soll mit Objektidentität arbeiten und ist also id . Aber ihre Ergebnisse divergieren, wenn ich eine benutzerdefinierte Methode betrachte. Warum das?

 py-mach >>class Hello(object): ... def hello(): ... pass ... py-mach >>Hello.hello is Hello.hello False py-mach >>id(Hello.hello) - id(Hello.hello) 0 

Ich fand den folgenden Auszug aus der Beschreibung des Python-Datenmodells etwas nützlich. Aber es hat nicht alles klar gemacht. Warum gibt die id Funktion die gleiche Ganzzahl zurück, wenn die benutzerdefinierten Methodenobjekte jedes Mal neu konstruiert werden?

Benutzerdefinierte Methodenobjekte können beim Erhalten eines Attributs einer Klasse (evtl. über eine Instanz dieser Klasse) erstellt werden, wenn dieses Attribut ein benutzerdefiniertes Funktionsobjekt, ein ungebundenes benutzerdefiniertes Methodenobjekt oder ein Klassenmethodenobjekt ist. Wenn das Attribut ein benutzerdefiniertes Methodenobjekt ist, wird nur ein neues Methodenobjekt erstellt, wenn die Klasse, aus der es abgerufen wird, die gleiche oder eine abgeleitete Klasse der im ursprünglichen Methodenobjekt gespeicherten Klasse ist; Andernfalls wird das ursprüngliche Methodenobjekt so wie es ist.

2 Solutions collect form web for “`Id`-Funktion in Python 2.7,` is`-Operator, Objektidentität und benutzerdefinierte Methoden [duplizieren]”

Die Python-Dokumentation für die ID-Funktion lautet:

Geben Sie die "Identität" eines Objekts zurück. Dies ist eine Ganzzahl (oder eine lange Ganzzahl), die während ihrer Lebensdauer garantiert und für dieses Objekt konstant ist. Zwei Objekte mit nicht überlappenden Lebenszeiten können denselben id () Wert haben.

(Betonung meiner)

Wenn du id(Hello.hello) == id(Hello.hello) , wird das Methodenobjekt nur kurz erstellt und gilt nach dem ersten Aufruf 'id' als "tot". Wegen des Aufrufs zur id , brauchst du nur Hello.hello , um für eine kurze Zeit zu leben – genug, um die ID zu erhalten. Sobald du diese ID bekommst, ist das Objekt tot und das zweite Hello.hello kann diese Adresse wiederverwenden, was es macht, als ob die beiden Objekte die gleiche ID haben.

Das ist im Gegensatz zu Hello.hello is Hello.hello – beide Instanzen müssen lange genug leben, um miteinander verglichen zu werden, also hast du am Ende zwei Live-Instanzen.

Wenn Sie stattdessen versucht haben:

 >>> a = Hello.hello >>> b = Hello.hello >>> id(a) == id(b) False 

… du würdest den erwarteten Wert von False .

Dies ist eine "einfache" Konsequenz, wie der Speicherzuweiser funktioniert. Es ist sehr ähnlich dem Fall:

 >>> id([]) == id([]) True 

Grundsätzlich python nicht garantieren, dass IDs nicht wiederverwendet werden – es garantiert nur, dass die id eindeutig ist , solange das Objekt am Leben ist . In diesem Fall ist das erste Objekt, das an id wird, nach dem Aufruf von id tot und (C) python verwendet diese id beim Erstellen des zweiten Objekts erneut.

Verlassen Sie sich niemals auf dieses Verhalten, da es von der Sprachreferenz erlaubt ist, aber sicher nicht erforderlich ist .

  • Python 2.7 str (055) gibt "45" anstelle von 055
  • Was ist der Unterschied zwischen Pythons "Extras" und "Site-Pakete" Verzeichnisse?
  • So schließen Sie ein cmd Fenster mit Python 2.7
  • Schwierigkeiten mit Listen in Python
  • Wie man Mac OS benutzt die Python von Homebrew installiert
  • Numexpr erkennt keinen Float-Typ (Sparse Matrix)
  • Wie kann ich zwei Konsolen aus einem einzigen Skript öffnen?
  • Fehler beim Drucken 'bs4.element.NavigableString'
  • Python-Multiprocessing: Kill Producer und Consumer-Prozesse mit KeyboardInterrupt
  • Ändere python version in terminal und intelliJ
  • PyInstaller lädt die Bilder von PyQt nicht in die GUI
  • Python ist die beste Programmiersprache der Welt.