Heim >Backend-Entwicklung >Python-Tutorial >Warum teilen leere Tupel, Wörterbücher und Listen Speicheradressen in CPython und warum hat dies nichts mit Veränderlichkeit zu tun?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 09:51:29594Durchsuche

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!

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