the global keyword:
Ned Batchelder
ned at nedbatchelder.com
Sun Jun 12 15:25:46 EDT 2016
On Sunday, June 12, 2016 at 3:08:01 PM UTC-4, BartC wrote:
> On 12/06/2016 00:44, Marcin Rak wrote:
> > Hi to all.
> >
> > I have the following file named Solver.py:
> > *****************************************
> > from Test import some_function, my_print
> > from Test import test_var
> >
> > some_function()
> > my_print()
> > print(test_var)
> > *****************************************
> >
> > and I have the following Test.py:
> > *****************************************
> > test_var = 5
> >
> > def some_function():
> > global test_var
> > test_var = 44
> > print("f {0}".format(test_var))
> >
> > def my_print():
> > print(test_var)
> > *****************************************
> >
> > Would you believe it that when I run Solver.py I get the following output:
> > f 44
> > 44
> > 5
> >
> > So my question is, how the heck is it possible that I get 5 as the last value printed? the global test_var (global to Test.py) I set to 44 when I ran some_function()??? does anyone have a clue they could throw my way?
>
> I was puzzled too. Apparently importing stuff using 'from':
>
> from Test import a,b,c
>
> is equivalent to:
>
> import Test
>
> a = Test.a
> b = Test.b
> c = Test.c
>
> which I hadn't been aware of. Then the link between a and Test.a (eg.
> Test.test_var) is broken (unless Test.a is something like a list so both
> still refer to the same data. But assignment to either - not an in-place
> mod - will break the connection).
Just to clarify: there is no link directly between a and Test.a, except that
both refer to the same object. Just as here there is no link between x
and y:
x = 12
y = x
As I explained elsewhere in this thread, import statements behave exactly
like assignments. The same reasoning that applies to multiple variables
referring to integers applies to multiple names being imported across
modules.
--Ned.
More information about the Python-list
mailing list