In c / c ++ haben Sie Variablen im Stapel, wenn Sie eine lokale Variable in einer Funktion erstellen.
CLU-Objekte existieren unabhängig von Prozeduraktivierungen. Raum wenn Objekte aus einem dynamischen Speicherbereich zugewiesen werden /.../ In Theorie, alle Objekte bestehen für immer fort. In der Praxis, die Der von einem Objekt belegte Platz kann zurückgewonnen werden, wenn das Objekt nein ist für jedes CLU-Programm zugänglicher.
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:
%Vor%Also wurde das erste Ergebnis ([]) im Heap erstellt und freigegeben, weil kein Name damit verbunden ist?
Ja, alle Python-Objekte befinden sich 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ückkehrt, 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-Sammler eintritt.
Einige Objekte (wie offene Dateien) haben Ressourcen, die automatisch freigegeben werden, wenn das Objekt freigegeben wird. Aus den obigen Gründen wird jedoch nicht empfohlen, sich darauf zu verlassen. Ressourcen sollten explizit geschlossen werden, wenn Sie damit fertig sind.
Ja, alle Werte in CPython werden auf dem Heap und der Referenz gezählt zugewiesen, 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 - alles zuzuteilen.
Sicherlich könnten Sie eine Analyse machen und feststellen, dass bestimmte Werte niemals an Funktionen übergeben werden und somit nicht entkommen können, aber das ist in Python nur von begrenztem Nutzen und der zusätzliche Overhead wäre es wahrscheinlich nicht wert.