Seite 1 von 1

Lokale Variablem löschen?

Verfasst: Montag 8. Februar 2010, 21:38
von Holgi22
Abend

gibt es eine Methode mit dem es möglich ist lokale Variablen zu löschen?
Ich habe in meinem script ca. 100 lokale Variablen und alle händisch mit:

del i, a,s,d,f,g,h
del in, out... usw

zu löschen ist nicht wirklich elegant. da wird es doch eine funktion geben oder?
Unter google find eich nur, dass mit locals() es nicht möglich sei lokale variablen zu löschen.
Gibt es da eine versteckte Funktion/Methode?

Grüsse :)

Verfasst: Montag 8. Februar 2010, 21:42
von Pekh
Da stellen sich mir zunächst einmal zwei Fragen:

1) Wie hast du es bitte geschafft, 100+ lokale Variablen anzulegen?

2) Warum willst du diese überhaupt löschen?

Verfasst: Montag 8. Februar 2010, 21:47
von Holgi22
ja sind ja nicht ganz 100. war jetzt nur übertrieben dargestellt. gezählt habe ich sie nicht. ;)

löschen deshalb, um den speicher wieder freizugeben. habe das desöfternen gesehen, dass am ende eines programms, die lokalen variablen gelöscht werden.

Verfasst: Montag 8. Februar 2010, 21:50
von Pekh
Ich vermute mal, daß das eher Programme aus der C-Ecke waren, in denen man sich selbst um die Speicherverwaltung kümmern muß.

Wenn das Programm zu Ende ist, schlägt bei Python ohnehin der Garbage-Collector zu und löscht alles. Das brauchst du auf keinen Fall selbst erledigen.

Verfasst: Montag 8. Februar 2010, 21:51
von Holgi22
achso. Wenn es so ist. Gut zu wissen :) Danke für den tip

Verfasst: Dienstag 9. Februar 2010, 09:35
von Hyperion
Holgi22 hat geschrieben:ja sind ja nicht ganz 100. war jetzt nur übertrieben dargestellt. gezählt habe ich sie nicht. ;)
Den Code würde ich aber gerne mal sehen :twisted:
Bitte pasten: paste.pocoo.org :-)

Verfasst: Freitag 19. Februar 2010, 01:52
von Trundle
Das mit dem ``del`` könnte auch noch den Grund haben, dass wenn Code auf Modulebene ausgeführt wird, dass dann danach dabei verwendete Namen gelöscht werden, so dass es nicht zu namespace pollution kommt. Von daher kann man schon einmal ein ``del`` in Python-Code sehen, ohne dass da jemand am Werk war, der denkt, man müsste selber den Speicher aufräumen.

Verfasst: Freitag 19. Februar 2010, 08:02
von BlackJack
@Trundle: Wenn man so viele Namen in einen Namensraum stopft, dass man die selber ``del``\eten muss, macht man IMHO auch etwas falsch. Insbesondere wenn's auf Modulebene passiert. Das Mittel dagegen ist nicht ``del`` sondern Aufteilen in Funktionen oder Methoden.

Verfasst: Freitag 19. Februar 2010, 12:53
von Trundle
Ich meinte damit nicht ein muss, sondern eher, dass man es vielleicht will. Etwa weil man zur Modul-Initialisierung einen Namen braucht, den man später im Modul nicht haben will. Das Modul funktioniert trotzdem wunderbar, wenn man diesen Namen nicht löscht.

Verfasst: Freitag 19. Februar 2010, 14:08
von ...
del ist toll...

Code: Alles auswählen

with open('blub.txt') as muh:
    foo = muh.readlines()
    while foo:
        print foo[0]
        del foo[0]
wenn blub.txt eher größer ist, sollte das mMn schon etwas geschwindigkeit mehr bringen als

Code: Alles auswählen

for bar in foo:
    print bar
Reine Vermutung...

Verfasst: Freitag 19. Februar 2010, 14:17
von cofi
... hat geschrieben:Reine Vermutung...
Falsche Vermutung. Zumindest wird dir `readlines` auf die Fuesse fallen, wenn die Dateien "eher groesser sind", denn beim iterieren ueber Dateiobjekte ist Python lazy und laedt nur das, was benoetigt wird.
Da die Liste bei deinem Vorschlag auch umgeordnet werden muss, wuerde ich eher sagen, dass es langsamer ist.

Verfasst: Freitag 19. Februar 2010, 14:45
von ...
Achso?

Aber readlines liest schon alle Zeilen in die Liste ein, oder nicht?
Oder ist die Liste nur eine Fake-Liste, die nicht hält was sie verspricht?

Verfasst: Freitag 19. Februar 2010, 15:02
von Trundle
Wie cofi sagte, gerade bei großen Dateien hat dein Vorschlag eine furchtbare Laufzeit. Listen sind nicht wirklich toll, wenn man ständig das vorderste Element entfernt, da dann jedes mal sämtliche Elemente in der Liste bewegt werden müssen.

Mal ganz anschaulich: Ich hab hier eben eine 200 MiB große Datei angelegt. Direktes Iterieren über das Dateiobjekt braucht keine Sekunde, alles einlesen und mit del das erste Element löschen habe ich jetzt nach zwei Minuten abgebrochen.

Verfasst: Freitag 19. Februar 2010, 15:19
von cofi
... hat geschrieben:Aber readlines liest schon alle Zeilen in die Liste ein, oder nicht?
Oder ist die Liste nur eine Fake-Liste, die nicht hält was sie verspricht?
Weil es eine echte Liste ist, tritt das Speicherproblem ueberhaupt erst auf. Es geht hier nicht um "echte Listen" oder "Fakes". Eine Funktion gibt immer genau das zurueck, was die Dokumentation sagt.
In Python 2.x sind das meist "echte" Sequenzen die den ganzen Speicher belegen, den der komplette Inhalt benoetigt.
In Python 3.x sind das meist/defaultmässig sog. "Views" mit anderen Worten Generatoren, die nur das belegen, was momentan benoetigt wird.

Aber auch in Python 3.x gibt `readlines` afair Listen zurueck.