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

Discussion in 'Python' started by J. Cliff Dyer, May 8, 2008.

  1. On Thu, 2008-05-08 at 12:00 -0700, Eric Hanchrow wrote:
    > (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?


    It's the same reason as this:

    >>> x=5
    >>> y=x
    >>> x

    5
    >>> y

    5
    >>> x=6
    >>> x

    6
    >>> y

    5
    >>>


    Python "variables" are just names that point at objects. When you
    import, the imported module gets bound to a name. When you use the an
    assignment statement, you bind a new object to the name, but other names
    bound to the object are not affected.

    So in your code, when you say

    >>> system.thing = "The new improved thing"


    You rebind the name system.thing, but the object it was originally bound
    to is unaffected. Strings are immutable, so you couldn't change that
    object if you tried. thing is still bound to the original object.
    Another feature of this behavior is as follows:
    >>> x=5
    >>> x is y

    True
    >>> x=5
    >>> y=x
    >>> x is y

    True
    >>> x=6
    >>> x is y

    False
    >>>


    The "is" operator tells you that the two objects are the same object.
    When you reassign one, it no longer points to the same object as the
    other. You would get the same behaviour in your code comparing
    system.thing and thing.

    Cheers,
    Cliff
    J. Cliff Dyer, May 8, 2008
    #1
    1. Advertising

  2. J. Cliff Dyer

    offby1 Guest

    Re: Surprising difference in behavior between "import blah" and "fromblah import thing"

    Ah. So from the point of view of mut.py, "thing" and "system.thing"
    are separate, unrelated variables; the former of which is initialized
    from the latter when mut says "from system import thing". Thanks.
    offby1, May 8, 2008
    #2
    1. Advertising

  3. Re: Surprising difference in behavior between "import blah" and "fromblah import thing"

    :'(
    I'm confused

    On Fri, May 9, 2008 at 12:03 AM, offby1 <> wrote:
    > Ah. So from the point of view of mut.py, "thing" and "system.thing"
    > are separate, unrelated variables; the former of which is initialized
    > from the latter when mut says "from system import thing". Thanks.
    > --
    > http://mail.python.org/mailman/listinfo/python-list
    >




    --
    http://www.badmuthahubbard.com
    Chuckk Hubbard, May 8, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Eric Hanchrow
    Replies:
    1
    Views:
    354
    Arnaud Delobelle
    May 9, 2008
  2. Skip Montanaro
    Replies:
    0
    Views:
    143
    Skip Montanaro
    May 30, 2013
  3. Cameron Simpson
    Replies:
    0
    Views:
    86
    Cameron Simpson
    May 31, 2013
  4. Göktuğ Kayaalp
    Replies:
    0
    Views:
    107
    Göktuğ Kayaalp
    May 31, 2013
  5. Skip Montanaro
    Replies:
    0
    Views:
    102
    Skip Montanaro
    May 31, 2013
Loading...

Share This Page