Wie gibt die Python-Funktion Objekte zurück?

8

Im folgenden Diagramm habe ich eine Abfrage für den Namen temp , der von der Funktion f

zurückgegeben wird

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

    
overexchange 06.04.2014, 15:34
quelle

4 Antworten

5
%Vor%

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.

    
laike9m 06.04.2014, 15:53
quelle
1

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.

    
ajkumar25 06.04.2014 15:54
quelle
1

"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.

    
flakes 06.04.2014 15:59
quelle
1

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: Ссылка

    
elishaolade 06.04.2014 16:05
quelle

Tags und Links