Warum teilen leere Tupel, Wörterbücher und Listen Speicheradressen in CPython und warum hat dies nichts mit Veränderlichkeit zu tun?

Patricia Arquette
Freigeben: 2024-10-31 09:51:29
Original
526 Leute haben es durchsucht

Why do empty tuples, dictionaries, and lists share memory addresses in CPython, and why is this not related to mutability?

Warum teilen leere Tupel, Wörterbücher und Listen Speicheradressen in CPython?

In CPython teilen sich leere Container (Tupel, Wörterbücher usw.). Listen) zeigen ein besonderes Verhalten hinsichtlich ihrer Objektidentifikatoren. Insbesondere haben leere Tupel wie () und leere Wörterbücher wie {} dieselbe Speicheradresse, und leere Listen wie [] haben ebenfalls eine gemeinsame Adresse.

Erklärung

Wenn id({}) oder id([]) in CPython aufgerufen wird, wird ein temporärer Container erstellt und an die ID-Funktion übergeben. Bevor die Funktion diesen temporären Container jedoch verarbeitet, wird dessen Speicheradresse erfasst und weitergegeben. Der temporäre Container wird dann verworfen, sodass nur seine Speicheradresse zurückbleibt.

Wenn anschließend ein weiterer Aufruf von id({}) oder id([]) erfolgt, bevor andere Container erstellt werden, wird dieselbe Speicheradresse verwendet wird voraussichtlich dem neuen temporären Container zugewiesen. Der Speicherzuweiser von CPython weist häufig Speicherblöcke nacheinander zu, was dieses Szenario sehr wahrscheinlich macht.

Da die Funktion „id“ auf Speicheradressen zur Objektidentifizierung basiert, folgt daraus, dass id({}) == id({}) und id([]) == id([]) gelten als wahr. Dieses Verhalten tritt nur während der vorübergehenden Existenz dieser leeren Behälter auf und weist nicht darauf hin, dass die Behälter irgendwelche inhärenten Eigenschaften gemeinsam haben.

Unterscheidung von Veränderlichkeit

Veränderlichkeit ist keine direkte Eigenschaft Faktor für dieses Phänomen. Es ist jedoch wichtig zu beachten, dass veränderliche Objekte wie Listen nicht wie unveränderliche Objekte wie Tupel und Zeichenfolgen zwischengespeichert oder wiederverwendet werden können. Folglich ist id(x) != id(y) für zwei beliebige veränderbare Objekte, auch wenn sie identische Elemente enthalten.

Signifikanz

Die ID eines Objekts ist nur einzigartig für seine Lebenszeit. Nachdem ein Objekt zerstört wurde oder bevor es erstellt wurde, kann ein anderes Objekt dieselbe ID erhalten.

Das obige ist der detaillierte Inhalt vonWarum teilen leere Tupel, Wörterbücher und Listen Speicheradressen in CPython und warum hat dies nichts mit Veränderlichkeit zu tun?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!