[Python-Dev] unexpected reload() behavior

Guido van Rossum guido at python.org
Sat Mar 20 16:29:35 EST 2004


> Not believing that old objects remained after the reload() I wrote a short
> test:
> 
>     a = 5
>     b = 7
>     c = (1,2,3)
> 
> imported it, modified it to
> 
>     a = 9
>     c = (1,2,3)
> 
> then reloaded it.  I was surprised to find that reloadtst.b did indeed still
> exist:
> 
>     >>> import reloadtst
>     >>> dir(reloadtst)
>     >>> dir(reloadtst)
>     ['__builtins__', '__doc__', '__file__', '__name__', 'a', 'b', 'c']
>     >>> # edit reloadtst.py
>     ...
>     >>> reload(reloadtst)
>     <module 'reloadtst' from 'reloadtst.py'>
>     >>> dir(reloadtst)
>     ['__builtins__', '__doc__', '__file__', '__name__', 'a', 'b', 'c']
> 
> It seems counterintuitive to me that reloadtst.b should still be defined.
> Is that behavior intention or accidental?

Intentional.  A module's __dict__ is not emptied when the reloaded
module is executed.  This allows code like this (which I have written)
that preserves a cache across relaod() calls:

    try:
        cache
    except NameError:
        cache = {}

--Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list