surprised by import in python 2.6

S

Stefaan Himpe

Hello list,

Recently someone asked me this question, to which I could not give an
answer. I'm hoping for some insight, or a manual page. What follows is
python 2.6.

The problem is with the difference between

from test import *

and

import test

First things first. Here's the code to test.py:

a = 3
def f():
global a
return a

Now, in the interactive interpreter:
3

in a second session:
4

Somehow, in the first session I cannot modify the global variable a
returned from f, but in the second session I can. To my eye, the only
difference seems to be a namespace. Can anyone shine some light on this
matter?

Thanks,
Stefaan.
 
I

Ian

Somehow, in the first session I cannot modify the global variable a
returned from f, but in the second session I can. To my eye, the only
difference seems to be a namespace. Can anyone shine some light on this
matter?

It's not the same global variable. In the second session, you import
the module test and bind it to the name "test" in the main namespace.
"test.a" and "test.f" refer to the objects named "a" and "f" in the
test namespace.

In the first session, you import all the variables exported by the
module test and bind them using the same names in the main namespace.
Thus "a" and "test.a" refer to the same int; and "f" and "test.f"
refer to the same function, but they are not the same variables. When
you rebind the name "a", it does not also magically rebind "test.a",
and vice versa.

Cheers,
Ian
 
E

Emile van Sebille

Somehow, in the first session I cannot modify the global variable a
returned from f, but in the second session I can. To my eye, the only
difference seems to be a namespace. Can anyone shine some light on this
matter?

It's not the same global variable. In the second session, you import
the module test and bind it to the name "test" in the main namespace.
"test.a" and "test.f" refer to the objects named "a" and "f" in the
test namespace.

In the first session, you import all the variables exported by the
module test and bind them using the same names in the main namespace.
Thus "a" and "test.a" refer to the same int; and "f" and "test.f"
refer to the same function, but they are not the same variables. When
you rebind the name "a", it does not also magically rebind "test.a",
and vice versa.
[/QUOTE]

Here's an example of what Ian's explained showing that f's global
namespace is the test module:


emile@paj39:~$ cat > test.py
a = 3
def f():
global a
return a
emile@paj39:~$ python
Python 2.6.4rc2 (r264rc2:75497, Oct 20 2009, 02:55:11)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 
A

Aahz

Recently someone asked me this question, to which I could not give an
answer. I'm hoping for some insight, or a manual page. What follows is
python 2.6.

The problem is with the difference between

from test import *

and

import test

Just adding to this thread for Gooja:

Don't use "import *" -- it makes debugging difficult because you can't
tell where a name comes from.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,586
Members
45,088
Latest member
JeremyMedl

Latest Threads

Top