Heim > Artikel > Backend-Entwicklung > Warum geben „id({}) == id({})“ und „id([]) == id([])“ in CPython „True“ zurück?
Die id()-Funktion von CPython weist Objekten eindeutige Bezeichner zu, diese Einzigartigkeit ist jedoch auf die Lebensdauer des Objekts beschränkt. Wenn Objekte zerstört werden, stehen ihre Kennungen zur Wiederverwendung zur Verfügung.
Bedenken Sie das folgende Verhalten:
<code class="python">tuple1 = () tuple2 = () dict1 = {} dict2 = {} list1 = [] list2 = [] # makes sense, tuples are immutable assert(id(tuple1) == id(tuple2)) # also makes sense dicts are mutable assert(id(dict1) != id(dict2)) # lists are mutable too assert(id(list1) != id(list2)) assert(id(()) == id(())) # why no assertion error on this? assert(id({}) == id({})) # or this? assert(id([]) == id([]))</code>
Warum machen id({}) == id({}) und id([ ]) == id([]) return True?
CPythons Speicherzuweisung
Diese Behauptungen sind aufgrund des Speicherzuweisungsmechanismus von CPython erfolgreich. Bei id({}) weist CPython ein Wörterbuch zu, übergibt seine Speicheradresse an id() und verwirft dann das Wörterbuch. Bei einem erneuten Aufruf findet CPython einen freien Speicherblock und verwendet dieselbe Adresse erneut. Veränderlichkeit hat keinen direkten Einfluss auf dieses Verhalten.
Codeobjekt-Caching
Codeobjekte zwischenspeichern Tupel und Zeichenfolgen, die in einer bestimmten Funktion, Klasse oder einem bestimmten Modul verwendet werden. Wenn dasselbe Literal (Ganzzahl, Zeichenfolge oder bestimmtes Tupel) mehrmals vorkommt, wird dasselbe Objekt wiederverwendet. Veränderbare Objekte werden immer zur Laufzeit erstellt, wodurch eine Wiederverwendung verhindert wird.
Fazit
Daher ist die ID eines Objekts in CPython nur während seiner Lebensdauer eindeutig. Sobald ein Objekt zerstört wird, kann seine ID von anderen Objekten wiederverwendet werden. Dies erklärt das im bereitgestellten Code-Snippet beobachtete Verhalten.
Das obige ist der detaillierte Inhalt vonWarum geben „id({}) == id({})“ und „id([]) == id([])“ in CPython „True“ zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!