What is a global statement? And how is it used? I have read Python’s official definition;
however, it doesn’t make a lot of sense to me.
Every “variable” in python is limited to a certain scope. The scope of a python “file” is the module-scope. Consider the following:
#file test.py myvariable = 5 # myvariable has module-level scope def func(): x = 3 # x has "local" or function level scope.
Objects with local scope die as soon as the function exits and can never be retrieved (unless you
return them), but within a function, you can access variables in the module level scope (or any containing scope):
myvariable = 5 def func(): print(myvariable) # prints 5 def func2(): x = 3 def func3(): print(x) # will print 3 because it picks it up from `func2`'s scope func3()
However, you can’t use assignment on that reference and expect that it will be propagated to an outer scope:
myvariable = 5 def func(): myvariable = 6 # creates a new "local" variable. # Doesn't affect the global version print(myvariable) # prints 6 func() print(myvariable) # prints 5
Now, we’re finally to
global keyword is the way that you tell python that a particular variable in your function is defined at the global (module-level) scope.
myvariable = 5 def func(): global myvariable myvariable = 6 # changes `myvariable` at the global scope print(myvariable) # prints 6 func() print(myvariable) # prints 6 now because we were able # to modify the reference in the function
In other words, you can change the value of
myvariable in the module-scope from within
func if you use the
As an aside, scopes can be nested arbitrarily deep:
def func1(): x = 3 def func2(): print("x=",x,"func2") y = 4 def func3(): nonlocal x # try it with nonlocal commented out as well. See the difference. print("x=",x,"func3") print("y=",y,"func3") z = 5 print("z=",z,"func3") x = 10 func3() func2() print("x=",x,"func1") func1()
Now in this case, none of the variables are declared at the global scope, and in python2, there is no (easy/clean) way to change the value of
x in the scope of
func1 from within
func3. That’s why the
nonlocal keyword was introduced in python3.x .
nonlocal is an extension of
global that allows you to modify a variable that you picked up from another scope in whatever scope it was pulled from.
mgilson did a good job but I’d like to add some more.
list1 =  list2 =  def main(): list1.append(3) #list1 =  list2 =  print list1, list2 print "before main():", list1, list2   main() [1,3]  print list1, list2 [1, 3] 
Inside a function, Python assumes every variable as local variable
unless you declare it as global, or you are accessing a global variable.
was possible because you are accessing the ‘list1’ and lists are mutable.
list2 = 
was possible because you are initializing a local variable.
However if you uncomment #list1 = , you will get
UnboundLocalError: local variable 'list1' referenced before assignment
It means you are trying to initialize a new local variable ‘list1’ but it was already referenced before,
and you are out of the scope to reassign it.
To enter the scope, declare ‘list1’ as global.
I strongly recommend you to read this even though there is a typo in the end.
Basically it tells the interpreter that the variable its given should be modified or assigned at the global level, rather than the default local level.
a = 1 def f(): a = 2 # doesn't affect global a, this new definition hides it in local scope a = 1 def f(): global a a = 2 # affects global a
You can use a global variable in other functions by declaring it as global in each function that modifies it
Python wants to make sure that you really know that’s what you’re playing with by explicitly requiring the global keyword.
See this answer