Im folgenden Diagramm habe ich eine Abfrage für den Namen temp
, der von der Funktion f
Im lokalen Rahmen f
ist temp
eine Referenzvariable, die auf ein Objekt 6
der Klasse int
verweist, wenn Sie return temp
in f
eine Referenzvariable output
angeben, die Teil von ist checkPassingMech
frame zeigt auf das gleiche Objekt 6
, auf das temp gezeigt hat.
Meine Frage:
Q1) Ist mein Verständnis richtig?
Q2) Wenn Q1 ja ist, dann gibt dieses Diagramm eine Illusion, dass temp
kein Referenztyp ist und seinen Wert in einer Box anzeigt und nicht mit einem Pfeil, der auf 6 zeigt, bin ich richtig?
Q3) Wenn Q2 ja ist, dann kann ich sagen, dass 6
tatsächlich im Heap gespeichert ist und temp
und output
auf diesen Heap-Space von frame (local stack) zeigen würden
aus doc :
CPython-Implementierungsdetail: Für CPython ist id (x) der Speicher Adresse, an der x gespeichert ist.
Genau genommen, wenn der Wert 6 ist, zeigen output
und temp
tatsächlich auf dasselbe Objekt, welches ein int
-Objekt ist, das beim Start von Python zwischengespeichert wird.
Sie können sich identifizieren, warum Der zurückgegebene Wert von ID (...) ändern? für weitere Informationen.
Ja, Ihr Verständnis ist richtig, neben Pythons Laufzeit behandelt nur Referenzen Objekte (die alle im Heap leben): was auf Pythons Stack geht (als Operanden) und die Ergebnisse seiner Bytecode-Operationen) sind immer Referenzen (auf Werte, die anderswo leben).
Alle Python-Objekte in der CPython-Implementierung werden auf dem Heap ausgeführt. Sie können im Detail lesen, wie Pythons Speicherverwaltung hier in der Dokumentation funktioniert:
Die Speicherverwaltung in Python umfasst einen privaten Heap, der alle enthält Python-Objekte und Datenstrukturen. Die Verwaltung dieses privaten Der Heap wird intern vom Python-Speichermanager sichergestellt. Der Python Speichermanager hat verschiedene Komponenten, die sich mit verschiedenen befassen Aspekte der dynamischen Speicherverwaltung, wie Teilen, Segmentierung, Vor-oder Caching.
"Typen beeinflussen nahezu alle Aspekte des Objektverhaltens. Sogar die Bedeutung der Objektidentität wird in gewissem Sinne beeinflusst: Für unveränderliche Typen können Operationen, die neue Werte berechnen, tatsächlich einen Verweis auf ein vorhandenes Objekt mit dem gleichen Typ und Wert zurückgeben. während für veränderbare Objekte dies nicht erlaubt ist, zB nach a = 1; b = 1, a und b können sich auf das gleiche Objekt mit dem Wert eins beziehen, je nach Implementierung, aber nach c = []; d = [], c und d verweisen garantiert auf zwei verschiedene, eindeutige, neu erstellte leere Listen (Beachten Sie, dass c = d = [] beiden c und d dasselbe Objekt zuweist.) "
Sie könnten also nicht einfach einen Pfeil auf 6 setzen, da nicht garantiert ist, dass jedes Mal die gleiche Referenz auf 6 steht.
1) Ja. 2) Ja. Das stimmt, temp ist kein Referenztyp, da es sich nicht auf andere Variablen bezieht. 3) Ja, der Wert sechs wird im Heap gespeichert (in diesem Szenario) und temp würde auf sechs zeigen, unabhängig von der Eingabe, und die Ausgabe ist gleich temp, was sie zu 6 macht.
Sie können eine gute Definition für Referenztypen in diesem Link erhalten: Ссылка
Tags und Links python