Gerenuk hat geschrieben:Kann man am Ende des Programmes den GC explizit anweisen alles zu löschen oder nicht? Soll ich selbst nachschauen?
Du hast recht, das wäre geradezu eine Zumutung.
Gerenuk hat geschrieben:Ich vermute es geht und es wäre nur ein Befehl. Das meine ich mit Schwarzmalerei.
Und selbst im schlimmsten Fall sind ein paar unvollständige Debug Infos besser als gar keine.
Klar kannst du das selber aufrufen. Aber auch dann ist nicht garantiert, dass der gc alles aufräumt. Was, wenn dein Programm vorher abschmiert? oder wenn es zirkuläre Referenzen gibt? Und wie ich schon geschrieben habe, werden die Werte nicht in der selben Reihenfolge gespeichert, wie die Variablen, deren Werte sie sind, out of scope gehen, sondern der gc löscht die Objekte in der Reihenfolge, die ihm gerade in den Kram passt. Nochmal:
Code: Alles auswählen
x = MyObjectWithDel(1)
x = MyObjectWithDel(2)
x = MyObjectWithDel(3)
del x
gc.collect()
Selbst wenn wir davon ausgehen, dass der gc alle drei Objekte löscht und ordentlich __del__() auf ihnen aufruft, er wird sie in irgendeiner Reihenfolge löschen, zB. 2, 3, 1, und dann steht in deiner Debug Datei nicht ein unvollständiger Wert, sondern ein falscher. Viel Spass beim Debuggen der Debug Infos.
Des Weiteren: Du scheinst zu glauben, dass
del x das Objekt löscht, oder als gelöscht markiert. Das tut es natürlich nicht. Es löscht nur den Namen 'x' aus dem Namespace und dekrementiert den ref counter des Objekts. Angenommen folgender Code:
Code: Alles auswählen
x = MyObjectWithDel(1)
some_object.some_method(x)
del x
Für's folgende: Sei V eine Variable, dann sei |V| das Objekt, auf das V verweist.
Dann kann es sein, dass |some_object| noch eine Referenz auf das ursprüngliche Objekt |x| hält, und dann wird |x| erst gelöscht werden, nachdem |some_object| gelöscht wurde. Natürlich vorausgesetzt, dass |some_object| nicht auch wieder von irgendwo her referenziert wird, etc. pp. ad nauseam. Am Ende wirst du dann jede Variable in deinem Programm händisch del'en müssen, und voila, willkommen in der C++-Welt. Python ist nicht C++, und vieles, was in C++ sinnvoll oder sogar notwendig ist, ist in Python unnötig, unsinnig und schädlich.
Und jetzt komm nicht wieder mit Schwarzseherei. Wenn Sachen nicht funktionieren, dann wird keine rosa Brille sie zum funktionieren bringen. Das war früher anders, als das Wünschen noch geholfen hat.
In specifications, Murphy's Law supersedes Ohm's.