Use of "global" keyword in Python Use of "global" keyword in Python python python

Use of "global" keyword in Python


The keyword global is only useful to change or create global variables in a local context, although creating global variables is seldom considered a good solution.

def bob():    me = "locally defined"    # Defined only in local context    print(me)bob()print(me)     # Asking for a global variable

The above will give you:

locally definedTraceback (most recent call last):  File "file.py", line 9, in <module>    print(me)NameError: name 'me' is not defined

While if you use the global statement, the variable will become available "outside" the scope of the function, effectively becoming a global variable.

def bob():    global me    me = "locally defined"   # Defined locally but declared as global    print(me)bob()print(me)     # Asking for a global variable

So the above code will give you:

locally definedlocally defined

In addition, due to the nature of python, you could also use global to declare functions, classes or other objects in a local context. Although I would advise against it since it causes nightmares if something goes wrong or needs debugging.


While you can access global variables without the global keyword, if you want to modify them you have to use the global keyword. For example:

foo = 1def test():    foo = 2 # new local foodef blub():    global foo    foo = 3 # changes the value of the global foo

In your case, you're just accessing the list sub.


This is the difference between accessing the name and binding it within a scope.

If you're just looking up a variable to read its value, you've got access to global as well as local scope.

However if you assign to a variable who's name isn't in local scope, you are binding that name into this scope (and if that name also exists as a global, you'll hide that).

If you want to be able to assign to the global name, you need to tell the parser to use the global name rather than bind a new local name - which is what the 'global' keyword does.

Binding anywhere within a block causes the name everywhere in that block to become bound, which can cause some rather odd looking consequences (e.g. UnboundLocalError suddenly appearing in previously working code).

>>> a = 1>>> def p():    print(a) # accessing global scope, no binding going on>>> def q():    a = 3 # binding a name in local scope - hiding global    print(a)>>> def r():    print(a) # fail - a is bound to local scope, but not assigned yet    a = 4>>> p()1>>> q()3>>> r()Traceback (most recent call last):  File "<pyshell#35>", line 1, in <module>    r()  File "<pyshell#32>", line 2, in r    print(a) # fail - a is bound to local scope, but not assigned yetUnboundLocalError: local variable 'a' referenced before assignment>>>