I'm trying to find out why the use of global
is considered to be bad practice in python (and in programming in general). Can somebody explain? Links with more info would also be appreciated.
4 Answers
This has nothing to do with Python; global variables are bad in any programming language.
However, global constants are not conceptually the same as global variables; global constants are perfectly harmless. In Python the distinction between the two is purely by convention: CONSTANTS_ARE_CAPITALIZED
and globals_are_not
.
The reason global variables are bad is that they enable functions to have hidden (non-obvious, surprising, hard to detect, hard to diagnose) side effects, leading to an increase in complexity, potentially leading to Spaghetti code.
However, sane use of global state is acceptable (as is local state and mutability) even in functional programming, either for algorithm optimization, reduced complexity, caching and memoization, or the practicality of porting structures originating in a predominantly imperative codebase.
All in all, your question can be answered in many ways, so your best bet is to just google "why are global variables bad". Some examples:
- Global Variables Are Bad - Wiki Wiki Web
- Why is Global State so Evil? - Software Engineering Stack Exchange
- Are global variables bad?
If you want to go deeper and find out why side effects are all about, and many other enlightening things, you should learn Functional Programming:

- 28,235
- 9
- 60
- 81

- 37,128
- 15
- 99
- 111
Yes, in theory, globals (and "state" in general) are evil. In practice, if you look into your python's packages directory you'll find that most modules there start with a bunch of global declarations. Obviously, people have no problem with them.
Specifically to python, globals' visibility is limited to a module, therefore there are no "true" globals that affect the whole program - that makes them a way less harmful. Another point: there are no const
, so when you need a constant you have to use a global.
In my practice, if I happen to modify a global in a function, I always declare it with global
, even if there technically no need for that, as in:
cache = {}
def foo(args):
global cache
cache[args] = ...
This makes globals' manipulations easier to track down.

- 211,518
- 52
- 313
- 390
-
7in many ways, a module in python is similar to a singleton class, and module globals are similar to class properties. – Corley Brigman Oct 03 '13 at 13:06
-
13@CorleyBrigman: singleton classes actually often suffer from the same problems typically attributed to globals :) – Erik Kaplun Oct 03 '13 at 13:40
-
4visibility of python modules is not limited to a module. They're available in the entire interpreter, and (here is the important thing) changes there affect the entire interpreter. It is not like a string that you create instances... is like modifying all the string instances. Monkey patching smell. – graffic Mar 21 '14 at 06:18
-
Finally, that sounds to me like "people say drink alcohol is bad, but everyone does". If you don't use a class, life without globals is a bit harder. – m3nda Nov 09 '15 at 00:05
-
3Most modules don't start with defining globals _except_ constants. Globals are bad means _variables_ / _global state_ not constants. – BlackJack Jul 30 '17 at 14:40
-
4Using globals is a horrible idea, one reason might be the inability to properly test functions that update some arbitrary dictionary that exists "somewhere". A codebase with globals cannot be actually proved functional. – Tomasz Sosiński Nov 23 '17 at 13:20
A personal opinion on the topic is that having global variables being used in a function logic means that some other code can alter the logic and the expected output of that function which will make debugging very hard (especially in big projects) and will make testing harder as well.
Furthermore, if you consider other people reading your code (open-source community, colleagues etc) they will have a hard time trying to understand where the global variable is being set, where has been changed and what to expect from this global variable as opposed to an isolated function that its functionality can be determined by reading the function definition itself.
(Probably) Violating Pure Function definition
I believe that a clean and (nearly) bug-free code should have functions that are as pure as possible (see pure functions). A pure function is the one that has the following conditions:
- The function always evaluates the same result value given the same argument value(s). The function result value cannot depend on any hidden information or state that may change while program execution proceeds or between different executions of the program, nor can it depend on any external input from I/O devices (usually—see below).
- Evaluation of the result does not cause any semantically observable side effect or output, such as mutation of mutable objects or output to I/O devices.
Having global variables is violating at least one of the above if not both as an external code can probably cause unexpected results.
Another clear definition of pure functions: "Pure function is a function that takes all of its inputs as explicit arguments and produces all of its outputs as explicit results." [1]. Having global variables violates the idea of pure functions since an input and maybe one of the outputs (the global variable) is not explicitly being given or returned.
(Probably) Violating Unit testing F.I.R.S.T principle
Further on that, if you consider unit-testing and the F.I.R.S.T principle (Fast tests, Independent tests, Repeatable, Self-Validating and Timely) will probably violate the Independent tests principle (which means that tests don't depend on each other).
Having a global variable (not always) but in most of the cases (at least of what I have seen so far) is to prepare and pass results to other functions. This violates this principle as well. If the global variable has been used in that way (i.e the global variable used in function X has to be set in a function Y first) it means that to unit test function X you have to run test/run function Y first.
Globals as constants
On the other hand and as other people have already mentioned, if the global variable is used as a "constant" variable can be slightly better since the language does not support constants. However, I always prefer working with classes and having the "constants" as a class member and not use a global variable at all. If you have a code that two different classes require to share a global variable then you probably need to refactor your solution and make your classes independent.
I don't believe that globals shouldn't be used. But if they are used the authors should consider some principles (the ones mentioned above perhaps and other software engineering principles and good practices) for a cleaner and nearly bug-free code.

- 7,002
- 5
- 43
- 52
-
1I like the "globals as constants is a problem" ... because if you're doing OO design ... it really is. Why does anybody but the IdCreator class need to know the ID_LEN ? – Erik Aronesty Mar 08 '18 at 20:13
They are essential, the screen being a good example. However, in a multithreaded environment or with many developers involved, in practice often the question arises: who did (erraneously) set or clear it? Depending on the architecture, analysis can be costly and be required often. While reading the global var can be ok, writing to it must be controlled, for example by a single thread or threadsafe class. Hence, global vars arise the fear of high development costs possible by the consequences for which themselves are considered evil. Therefore in general, it's good practice to keep the number of global vars low.

- 41
- 1