the global keyword:
Ned Batchelder
ned at nedbatchelder.com
Sat Jun 11 23:41:12 EDT 2016
On Saturday, June 11, 2016 at 8:13:50 PM UTC-4, Marcin Rak wrote:
> On Saturday, 11 June 2016 19:09:29 UTC-5, MRAB wrote:
> > On 2016-06-12 00:50, Random832 wrote:
> > > On Sat, Jun 11, 2016, at 19:44, Marcin Rak wrote:
> > >> 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?
> > >
> > > Importing a variable from a module copies its value into your own
> > > module's variable. Updates to the source module's variable will not be
> > > reflected in your module.
> > >
> > Not true. Importing doesn't copy the value.
> >
> > Importing a name creates a new name in the local scope that refers to
> > the same object that the imported name referred to.
>
> If that's the case, how is it that I get 5 for test_var???
Assignment makes a name refer to a value:
x = 12 # Now x refers to 12
More than one name can refer to a value:
x = 12
y = x # Now x and y both refer to 12
Re-assigning one name doesn't affect other names referring to
the old value:
x = 12
y = x
x = 24 # Now x refers to 24, and y still refers to 12
Each module has its own globals (this makes the name "global" a bit
of a misnomer. Importing a name from a module is an assignment
statement in disguise, and each module has its own names:
# Test.py
test_var = 5
# Solver.py
from Test import test_var
# This import is effectively:
# Solver.test_var = Test.test_var
#
# Now Test.test_var and Solver.test_var both refer to 5
Reassigning one name doesn't affect other names referring to
the old value:
# Test.py
global test_var
test_var = 44
# Test.test_var refers to 44
# Solver.test_var still refers to 5
After all of your code is run, the test_var in Solver.py is still 5.
A longer explanation is at http://bit.ly/pynames1 that may help.
--Ned.
More information about the Python-list
mailing list