Heim  >  Artikel  >  Backend-Entwicklung  >  Warum geben „id({}) == id({})“ und „id([]) == id([])“ in CPython „True“ zurück?

Warum geben „id({}) == id({})“ und „id([]) == id([])“ in CPython „True“ zurück?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-30 04:11:03253Durchsuche

Why do `id({}) == id({})` and `id([]) == id([])` return True in CPython?

Eindeutige Objektbezeichner in CPython: Warum id({}) == id({}) und id([]) == id([])

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn