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)
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 : –
in the function before using
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)
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
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.
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.
You can read a global without declaring it global. But to write a global, you need to declare it global.
In your second piece of code you have created a local variable in RHS and without defining it, you are assigning it to the LHS variable
var which is global (a variable defined outside the function is considered global explicitly).
If your intention is to create a local variable inside the function and assign it to the value of the global variable, this will do the trick:
var = 0 def func(num): print num func.var = var # func.var is referring the local # variable var inside the function func if num != 0: func(num-1) func(10)
def runscan(self): p = os.popen('LD_PRELOAD=/usr/libv4l/v4l1compat.so zbarcam /dev/video0','r') def input(self): self.entryc.insert(END, code)
how about this?
i want use local ‘code’ to the next function to insert the result of barcode to my Tkinter entryBox..
Each function block is a local scope. If you want to assign to global variables, you need to do so explicitly:
var = 0 def func(num): print num global var var = 1 if num != 0: func(num-1) print var # 0 func(2) print var # 1