Hallo zusammen,
ich benutze verschachtelte Datenstrukturen in Python und frage mich, was mit dem davon belegten Speicher geschieht, wenn dem Namen der Struktur eine andere Struktur zugewiesen wird, dh. wenn auf die existierende Struktur kein Pointer mehr zeigt.
Meines Wissens gibt es keine "free(<var_name>)"-Funktion, equivalent etwa zu C.
Mein Problem also: Wie verhindere ich in Python, dass der Speicher von nicht mehr benötigten Datenstrukturen zugemüllt wird? Merkt der Python-Interpreter am Ende selbst, wenn zu einem Datum kein Pointer mehr existiert?
Wär super, wenn mir jemand hierzu einen Tip geben könnte, ich hab bisher nichts dazu gefunden.
Gruß Thomas
Benutzten Speicher befreien
Hi. Wenn Objekte von außen nicht mehr erreichbar sind, werden sie Opfer der Garbage Collection. Ein Beispiel:
Nun ist a nicht mehr erreichbar und wird dennoch referenziert (von a.b). a.b wird aber auch nicht gelöscht, da "a" darauf zeigt. Trotzdem werden die beiden Objekte während der Laufzeit gelöscht, da der Garbage Collector aktiv ist. Dieser ist von Python aus direkt ansprechbar, über das Modul gc. Darin findest du auch nähere Informationen zu dem Thema.
Code: Alles auswählen
class A: pass
a=A()
a.b=a
del a
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi auch,
das von Milan gezeigte Beispiel ist ein Sonderfall, der vom Garbagecollector behandelt wird.
Wenn auf ein "normales" Objekt keine Referenz mehr zeigt wird das Objekt bei nächster Gelegenheit gelöscht und die Resourcen freigegeben. Intern haben Pythonobjekte einen Referenzzähler, der bei jeder Zuweisung des Objekts zu einem Variablennamen oder zu einem komplexen Datentyp (z.B. Liste oder Dictionary) hochgezählt und wenn die Variable nicht mehr gebraucht wird, oder das Objekt aus der Liste oder dem Dictionary entfernt wird wieder runtergezählt wird. Ist der Zähler dann auf Null weiss Pyton, daß das Objekt nicht mehr gebraucht wird und ruft dessen __del__ Methode auf oder, bei nichtforhandensein einer solchen, wird der Speicher, den das Objekt belegt freigegeben und alle attribute, die ja auch auf Objekte zeigen gelöscht und damit deren Referenzzähler um eins verringert.
Gruß
Dookie
das von Milan gezeigte Beispiel ist ein Sonderfall, der vom Garbagecollector behandelt wird.
Wenn auf ein "normales" Objekt keine Referenz mehr zeigt wird das Objekt bei nächster Gelegenheit gelöscht und die Resourcen freigegeben. Intern haben Pythonobjekte einen Referenzzähler, der bei jeder Zuweisung des Objekts zu einem Variablennamen oder zu einem komplexen Datentyp (z.B. Liste oder Dictionary) hochgezählt und wenn die Variable nicht mehr gebraucht wird, oder das Objekt aus der Liste oder dem Dictionary entfernt wird wieder runtergezählt wird. Ist der Zähler dann auf Null weiss Pyton, daß das Objekt nicht mehr gebraucht wird und ruft dessen __del__ Methode auf oder, bei nichtforhandensein einer solchen, wird der Speicher, den das Objekt belegt freigegeben und alle attribute, die ja auch auf Objekte zeigen gelöscht und damit deren Referenzzähler um eins verringert.
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
Hallo,
vielen Dank für die Information! mein "Problem" ist damit erledigt.
Gruß Thomas
vielen Dank für die Information! mein "Problem" ist damit erledigt.
Gruß Thomas