Surprising difference in behavior between "import blah" and "from blah import thing"

Arnaud Delobelle arnodel at googlemail.com
Fri May 9 01:54:12 EDT 2008


Eric Hanchrow <offby1 at blarg.net> writes:

> (This is with Python 2.5.2, on Ubuntu Hardy, if it matters.)
>
> This seems so basic that I'm surprised that I didn't find anything
> about it in the FAQ.  (Yes, I am fairly new to Python.)
>
> Here are three tiny files:
>
> ==== mut.py ====
>
>     import system
>     from system import thing
>
>     def doit():
>         print "       thing is", thing
>
>     def do_it_slightly_differently():
>         print "system.thing is", system.thing
>
> ==== system.py ====
>     thing = "I am the original thing!!"
>
> ==== test.py ====
>     import mut
>     mut.doit()
>     mut.do_it_slightly_differently()
>     import system
>
>     system.thing = "The new improved thing"
>     mut.doit()
>     mut.do_it_slightly_differently()
>
> When I run "python test.py", I see
>
>            thing is I am the original thing!!
>     system.thing is I am the original thing!!
>            thing is I am the original thing!!
>     system.thing is The new improved thing
>
> What surprises me is that the assignment to "system.thing" in test.py
> only seems to affect the use of "system.thing" in mut.py, and not
> affect the use of just plain "thing" in that same file.  I would have
> expected my assignment to have affected both, or perhaps neither.
>
> I have no idea why these two differ.  Can someone explain?
> -- 
> Rarely do we find men who willingly engage in hard, solid
> thinking.  There is an almost universal quest for easy answers
> and half-baked solutions.  Nothing pains some people more
> than having to think.
>         -- Martin Luther King, Jr.
>         from "Strength to Love," 1963.

    import system
    from system import thing

is the same as:

    import system
    thing = system.thing

Do you expect system.thing to be rebound when you rebind thing?

HTH

-- 
Arnaud




More information about the Python-list mailing list