On Tue, 15 Nov 2011 17:01:23 +0000, Prasad, Ramit wrote: > Can you expand on why 'del' is "tricky"/misleading?
People often imagine that the del statement sends a message to the object "please delete yourself", which then calls the __del__ method. That is incorrect. "del x" is an unbinding operation, it removes the *name* "x" from the current namespace. As a side-effect, if the object which was bound to x no longer has any other references to it, then the garbage collector will delete it and __del__ may be called. (I say "may be called" rather than "will" because there are circumstances where __del__ methods won't get called, such as during interpreter shutdown.) On the other hand, "del x[i]" does work like the way people expect. It deletes items from collections (lists, dicts, etc.) and does so by calling the method x.__delitem__(i). This also may cause the garbage collector to delete the object which was at x[i] if that was the last reference to that object. CPython's implementation keeps a count of references for each object, and the garbage collector deletes the object immediately that reference count reaches zero. This is fast, simple, deterministic (objects will be predictably deleted as soon as they can be), but simple-minded, and so it is aided by a second garbage collector which runs periodically, looking for reference cycles. You can set how often this second garbage collector runs using the gc module. Jython uses the Java garbage collector, and IronPython the .Net garbage collector. Neither are reference counters, and (as far as I know) neither guarantees that objects will be deleted as soon as they are free to be deleted. They will be deleted whenever the garbage collector gets around to it. -- Steven -- http://mail.python.org/mailman/listinfo/python-list