Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python global/local variables

Why does this code work:

var = 0

def func(num):
    print num
    var = 1
    if num != 0:
        func(num-1)

func(10)

but this one gives a "local variable 'var' referenced before assignment" error:

var = 0

def func(num):
    print num
    var = var
    if num != 0:
        func(num-1)

func(10)
like image 254
JJ Beck Avatar asked Oct 26 '12 17:10

JJ Beck


2 Answers

If you have var = ... anywhere in a function, the name "var" will be treated as a local variable for the entire function, regardless of where that assignment occurs. This means that all occurrences of var in your function will be resolved in the local scope, so the right hand side of var = var results in the referenced before assignment error because var has not yet been initialized in the function's scope.

like image 21
Andrew Clark Avatar answered Sep 28 '22 09:09

Andrew Clark


Because in the first code, you have created a local variable var and used its value, whereas in the 2nd code, you are using the local variable var, without defining it.

So, if you want to make your 2nd function work, you need to declare : -

global var

in the function before using var.

def func(num):
    print num
    var = 1  <--  # You create a local variable
    if num != 0:
        func(num-1)

Whereas in this code:

def func(num):
    print num
    var = var <--- # You are using the local variable on RHS without defining it
    if num != 0:
        func(num-1)

UPDATE: -

However, as per @Tim's comment, you should not use a global variable inside your functions. Rather deifine your variable before using it, to use it in local scope. Generally, you should try to limit the scope of your variables to local, and even in local namespace limit the scope of local variables, because that way your code will be easier to understand.

The more you increase the scope of your variables, the more are the chances of getting it used by the outside source, where it is not needed to be used.

like image 197
Rohit Jain Avatar answered Sep 28 '22 08:09

Rohit Jain