Verstehen der sich ändernden ID von unveränderlichen Strings in Python
In Python haben unveränderliche String-Objekte aufgrund von Faktoren wie String-Internierung typischerweise sich ändernde IDs , Wiederverwendung von Speicherorten und Codeoptimierung. Während Unveränderlichkeit auf eine konstante ID schließen lässt, wurde das folgende Verhalten beobachtet:
Ursprüngliche Beobachtung:
id('so') # Changes on every call
Ändernde IDs:
Dieses Verhalten wird durch das Fehlen einer garantierten String-Internierung in CPython verursacht. Python interniert nicht immer Zeichenfolgen, daher können wiederholte Aufrufe von id('so') zu unterschiedlichen IDs führen.
Wiederverwendung von Speicherorten:
Python kann Speicherorte für wiederverwenden neue String-Objekte, was zu gelegentlichen ID-Übereinstimmungen auch für verschiedene Strings führt. Dies ist unvorhersehbar und hängt von der Speichernutzung ab.
Codeoptimierung:
Python-Optimierer können konstante Ausdrücke (z. B. „foo“ „bar“) zur Kompilierungszeit falten. Speichern der resultierenden Zeichenfolge an einem einzigen Speicherort. Dies führt zu konsistenten IDs für diese Ausdrücke.
Ausnahme:
Konstante Zeichenfolgen, die ASCII-Buchstaben, Ziffern oder Unterstriche verwenden, werden vom Python-Compiler interniert. Daher verwenden nachfolgende Literale mit denselben Zeichen dasselbe interne Zeichenfolgenobjekt wieder, was zu konsistenten IDs führt.
Zusätzliche Beobachtungen:
Das obige ist der detaillierte Inhalt vonWarum scheinen unveränderliche Python-Strings wechselnde IDs zu haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!