71

From this code:

COUNT = 0

def increment():
    COUNT = COUNT + 1

increment()

I get the following error:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    increment()
  File "test.py", line 4, in increment
    COUNT = COUNT+1
UnboundLocalError: local variable 'COUNT' referenced before assignment

Why? How can I increment the global variable COUNT from inside the function?

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
user873286
  • 7,799
  • 7
  • 30
  • 38
  • 1
    The use of `global` among beginners is usually a sign of bad design. – Rik Poggi May 08 '12 at 21:51
  • without using `global` you can't modify the value of a global variable inside a function, you can only use it's value inside the function. But if you want to assign a new value to it then you've to use the `global` keyword first. – Ashwini Chaudhary May 08 '12 at 21:53
  • This should answer your question: http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-created-them Looks like Python won't change the global value unless you specify that it's what you want to do. – Phil Nicholson May 08 '12 at 21:46

2 Answers2

126

Use a global statement, like so:

COUNT = 0

def increment():
    global COUNT
    COUNT = COUNT+1

increment()

Global variables can be accessed without using global, but the statement is required in order to change the value of the global variable.

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
cobie
  • 7,023
  • 11
  • 38
  • 60
35

This is because globals don't bleed into the scope of the function. Use the global statement to force this for assignment:

>>> COUNT = 0
>>> def increment():
...     global COUNT
...     COUNT += 1
... 
>>> increment()
>>> print(COUNT)
1

Note that using globals is a really bad idea - it makes code hard to read, and hard to use. Instead, return a value from your function (using return) and use that to do something. If the same data needs to be accessible from a range of functions, consider making a class.

It's also worth noting that CAPITALS is generally reserved for constants, so it's a bad idea to name global variables like this. For normal variables, lowercase_with_underscores is preferred.

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
Gareth Latty
  • 86,389
  • 17
  • 178
  • 183