problembär hat geschrieben:
"del()" löscht - mehr oder weniger zuverlässig - Objekte aus dem Speicher.
Genau genommen muss man bei `del` unterscheiden, welche Art von Aufruf vorliegt. In Deinem zweiten Beispiel löschst Du damit den Namen, nicht das Objekt! Folgender Ausschnitt verdeutlicht das:
Code: Alles auswählen
In [6]: s = "Ich bin ein String"
In [7]: c = s
In [8]: del s
In [9]: s
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/home/nelson/src/Python/scale/<ipython-input-10-f4d5d0c0671b> in <module>()
----> 1 s
NameError: name 's' is not defined
In [10]: c
Out[10]: 'Ich bin ein String'
Sowohl `s` als auch `c` verweisen auf
dasselbe Objekt. Lösche ich `s`, so kann das Obejkt dahinter noch nicht gelöscht werden, da es über `c` noch gebunden ist.
Für das erste Beispiel gilt hingegen dieses:
Python Doku hat geschrieben:
Deletion of attribute references, subscriptions and slicings is passed to the primary object involved; deletion of a slicing is in general equivalent to assignment of an empty slice of the right type (but even this is determined by the sliced object).
Nachzulesen hier:
Link
`del` an sich ist schon zuverlässig - man muss nur wissen, was es tut. Objekte löscht es einfach nicht direkt; dafür ist der Garbage Collector von Python zuständig. Mit `del` kann man aber Bindings löschen und damit dem GC die Möglichkeit geben, ein Objekt zu löschen.
Wer explizite Speicherverwaltung wünscht, der ist in Python falsch!