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

Eric Hanchrow offby1 at blarg.net
Thu May 8 15:00:51 EDT 2008


(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.




More information about the Python-list mailing list