Gleiche ID für mehrere Objekte: Pythons skurriles Verhalten
In Python kann das Erstellen mehrerer Objekte, ohne ihnen Namen zuzuweisen, tatsächlich dazu führen, dass sie die ID teilen gleiche ID. Dieses scheinbare Paradoxon rührt von der Tatsache her, dass die ID eines Objekts nur innerhalb seiner Lebensdauer eindeutig ist.
Wenn Sie eine Variable erstellen, die auf ein Objekt verweist, wie etwa someClass(), beginnt die Lebensdauer des Objekts, wenn die Variable wird zugewiesen und endet, wenn es außerhalb des Gültigkeitsbereichs liegt. In dem von Ihnen bereitgestellten Beispiel:
print(someClass()) print(someClass())
Die beiden someClass()-Aufrufe führen zu zwei Objekten, die jedoch beide innerhalb desselben Aufrufs zum Drucken erstellt und zerstört werden. Daher haben sie dieselbe Lebensdauer und können dieselbe ID haben.
Dieses Verhalten wird durch die Verwendung der Referenzzählung für die Garbage Collection in Python 3.3.3 noch verstärkt. Wenn der Referenzzähler eines Objekts Null erreicht (d. h. keine Variablen verweisen darauf), kann es gelöscht werden. In unserem Beispiel führt der zweite Aufruf von someClass() dazu, dass der Referenzzähler des ersten Objekts Null erreicht, wodurch es zur sofortigen Freigabe freigegeben wird.
Da das nächste zuzuordnende Objekt am selben Speicherort platziert wird Wie das erste Objekt hat es am Ende dieselbe ID. Dies erklärt, warum das mehrmalige Aufrufen derselben Klasse in schneller Folge zu Objekten mit derselben ID führen kann.
Wenn Sie eindeutige IDs für Objekte benötigen, können Sie dieses Verhalten umgehen, indem Sie sie explizit Variablen zuweisen und diese beibehalten :
a = someClass() b = someClass() print(id(a)) print(id(b))
Hier beziehen sich a und b auf separate Objekte mit unterschiedlichen IDs, auch wenn sie derselben Klasse angehören. Alternativ können Sie Ihren eigenen klassenspezifischen ID-Mechanismus implementieren, um die Eindeutigkeit sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum haben mehrere Python-Objekte manchmal dieselbe ID?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!