2012-07-27 12 views
7

In C/C++ haben Sie Variablen im Stapel, wenn Sie eine lokale Variable in einer Funktion erstellen.Python erstellt alles von Heap?

http://effbot.org/zone/call-by-object.htm

CLU Objekte existieren unabhängig von Verfahren Aktivierungen. Der Bereich für Objekte wird aus einem dynamischen Speicherbereich zugewiesen. /.../ In der Theorie bleiben alle Objekte für immer bestehen. In der Praxis kann der von einem Objekt belegte Speicherplatz zurückgewonnen werden, wenn das Objekt für kein CLU-Programm länger verfügbar ist.

Bedeutet das, dass Objekte in Python vom Heap erstellt werden (wie in malloc in c/C++)? und die Objekte werden freigegeben, wenn ihnen kein Name zugeordnet ist (wie Smart Pointer)?

Beispiel:

def foo(a): 
    result = [] 
    result.append(a) 
    return result 

foo("hello") 

myList = foo("bye") 

Das erste Ergebnis ([]) wurde in dem Heap erstellt und wurde aufgehoben, weil es keine seinen Namen mit ihm verbunden?

+0

Sie können auch Dinge manuell löschen mit 'del' wie in' del result', wenn Sie denken, dass Sie müssen. –

+0

Wenn Sie die Frage stellen möchten, dass Ihre Funktion immer dieselbe Liste verwenden soll, beachten Sie, dass Sie sie als 'def foo (a, result = [])' definieren können, und die gleiche Liste wird jedes Mal verwendet Rufen Sie die Funktion auf, da sie erstellt wird, wenn die Funktion definiert ist, und nicht, wenn sie ausgeführt wird. – geoffspear

Antwort

12

Ja, alle Python-Objekte leben auf dem Heap (zumindest auf CPython.) Sie sind Referenzzähler: Sie werden aufgehoben, wenn der letzte Verweis auf das Objekt verschwindet. (CPython hat auch einen Garbage Collector, um Zyklen zu unterbrechen.)

In CPython verschwindet Ihre erste Liste, sobald die Funktion zurückgibt, da Sie den Rückgabewert nicht an einen Namen gebunden haben und der Referenzzähler auf Null gesunken ist. In anderen Implementierungen kann das Objekt länger leben, bis der Müll-Kollektor startet.

Einige Objekte (wie offene Dateien) haben Ressourcen beigefügt, die automatisch freigegeben werden, wenn das Objekt freigegeben wird, aber aus dem oben genannten wird es nicht empfohlen Verlasse dich darauf. Ressourcen sollten explizit geschlossen werden, wenn Sie damit fertig sind.

5

Ja, alle Werte in CPython werden auf dem Heap und Referenz-gezählt zugeordnet, um zu wissen, wann sie freigegeben werden müssen. Anders als in C gibt es in den meisten Fällen keine Möglichkeit zu wissen, ob ein Wert seine Funktion überlebt. Daher ist es die einzig sichere Sache, alles zu haufen.

Natürlich könnten Sie einige Analysen durchführen und feststellen, dass bestimmte Werte niemals an Funktionen übergeben werden und daher nicht entkommen können, aber das ist in Python nur von begrenztem Nutzen und der zusätzliche Overhead wäre es wahrscheinlich nicht wert.

4

Als Ergänzung zu den anderen Antworten, hier ist ein Weg, wenn Garbage-Collection geschieht zu verfolgen, die spezielle Methode __del__ mit:

class Test(object): 
    def __init__(self, name): 
     self.name = name 

    def __del__(self): 
     print "deleting {0}".format(self.name) 

print "discarded instance creation" 
Test("hello") 

print "saved instance creation" 
myList = Test("bye") 

print "program done" 

Ausgang:

 
discarded instance creation 
deleting hello 
saved instance creation 
program done 
deleting bye 

Für weitergehende Daten, siehe gc module.