En Fri, 09 May 2008 12:44:21 -0300, Patrick Mullen <[EMAIL PROTECTED]> escribió:

> I had some very interesting results with this code to do what is asked:
>
> for key in globals().keys():
>     del globals()[key]
> for key in locals().keys():
>     del locals()[key]

Removing items from locals() has no effect, at least on CPython. Local 
variables doesn't "live" on that dictionary, locals() is built on demand when 
required.
At module level, locals and globals are the same thing.

py> def foo():
...   x = 1
...   y = "hello"
...   print locals()
...   for key in locals().keys():
...     print "deleting", key
...     del locals()[key]
...   print locals()
...   print x, y
...
py> foo()
{'y': 'hello', 'x': 1}
deleting y
deleting x
{'y': 'hello', 'x': 1, 'key': 'x'}
1 hello

BTW, if you want to clear a dictionary, just use its clear() method. So a more 
compact form of your code would be: globals.clear().
Anyway I don't see why do you want to keep an empty module around - just remove 
it from sys.modules, and if nobody else holds a reference to it, it will be 
destroyed.

> It might be better to reverse the two steps, I didn't give it much thought.
> Anyway, when this is done, all of the builtins spill into globals and locals
> (since __builtin__ was deleted).  I thought that was interesting.

Sorry I don't understand you...

> It did have the effect that is asked for, although there may be more
> unintended consequences.  Also if any objects are attached to any of the
> builtins I expect they will still be around.

Your code removes all direct references to objects from the current module, it 
does not free memory "per se". There may be other references elsewhere. Objects 
are deleted (and memory freed) only when their reference count reaches zero.

-- 
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to