Lokale Variablem löschen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Holgi22
User
Beiträge: 19
Registriert: Mittwoch 3. Februar 2010, 20:39

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 :)
Hi Ha Ho
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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?
Holgi22
User
Beiträge: 19
Registriert: Mittwoch 3. Februar 2010, 20:39

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.
Hi Ha Ho
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
Holgi22
User
Beiträge: 19
Registriert: Mittwoch 3. Februar 2010, 20:39

achso. Wenn es so ist. Gut zu wissen :) Danke für den tip
Hi Ha Ho
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

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...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

... 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.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

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?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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