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