In Python what is a global statement? In Python what is a global statement? python python

In Python what is a global statement?


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.pymyvariable = 5  # myvariable has module-level scopedef 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 = 5def func():    print(myvariable)  # prints 5def 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 = 5def func():    myvariable = 6     # creates a new "local" variable.                         # Doesn't affect the global version    print(myvariable)  # prints 6func()print(myvariable)      # prints 5

Now, we're finally to global. The 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 = 5def func():    global myvariable    myvariable = 6    # changes `myvariable` at the global scope    print(myvariable) # prints 6func()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 global keyword.


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 = [1]list2 = [1]def main():    list1.append(3)    #list1 = [9]    list2 = [222]    print list1, list2print "before main():", list1, list2>>> [1] [1]main()>>> [1,3] [222]print list1, list2    >>> [1, 3] [1]

Inside a function, Python assumes every variable as local variableunless you declare it as global, or you are accessing a global variable.

list1.append(2) 

was possible because you are accessing the 'list1' and lists are mutable.

list2 = [222]

was possible because you are initializing a local variable.

However if you uncomment #list1 = [9], 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.