Visibility of global variables in imported modules Visibility of global variables in imported modules python python

Visibility of global variables in imported modules


Globals in Python are global to a module, not across all modules. (Many people are confused by this, because in, say, C, a global is the same across all implementation files unless you explicitly make it static.)

There are different ways to solve this, depending on your actual use case.


Before even going down this path, ask yourself whether this really needs to be global. Maybe you really want a class, with f as an instance method, rather than just a free function? Then you could do something like this:

import module1thingy1 = module1.Thingy(a=3)thingy1.f()

If you really do want a global, but it's just there to be used by module1, set it in that module.

import module1module1.a=3module1.f()

On the other hand, if a is shared by a whole lot of modules, put it somewhere else, and have everyone import it:

import shared_stuffimport module1shared_stuff.a = 3module1.f()

… and, in module1.py:

import shared_stuffdef f():    print shared_stuff.a

Don't use a from import unless the variable is intended to be a constant. from shared_stuff import a would create a new a variable initialized to whatever shared_stuff.a referred to at the time of the import, and this new a variable would not be affected by assignments to shared_stuff.a.


Or, in the rare case that you really do need it to be truly global everywhere, like a builtin, add it to the builtin module. The exact details differ between Python 2.x and 3.x. In 3.x, it works like this:

import builtinsimport module1builtins.a = 3module1.f()


As a workaround, you could consider setting environment variables in the outer layer, like this.

main.py:

import osos.environ['MYVAL'] = str(myintvariable)

mymodule.py:

import osmyval = Noneif 'MYVAL' in os.environ:    myval = os.environ['MYVAL']

As an extra precaution, handle the case when MYVAL is not defined inside the module.


A function uses the globals of the module it's defined in. Instead of setting a = 3, for example, you should be setting module1.a = 3. So, if you want cur available as a global in utilities_module, set utilities_module.cur.

A better solution: don't use globals. Pass the variables you need into the functions that need it, or create a class to bundle all the data together, and pass it when initializing the instance.