I want to use 'number' variable that was created out of the function and use it in couple functions and also give it an initial value 0, but it gives "local variable 'number' referenced before assignment" error at the last line of code.How could I fix it?Thanks in advance.
lst_img=[img0,img1,img2,img3,img4]
number=0
def go_forward():
global number
number+=1
shwimage.grid_forget()
global shwimage1
shwimage1=Label(image=lst_img[number])
shwimage1.grid(row=0,column=0,columnspan=3)
def go_back():
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
You have to also tell go_back() to use the global variable:
def go_back():
global number #add this
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
global tells the function to use the global number so each function has to be told this separately or it will default to using the local version.
I believe in go_back() function also, you are trying to reference the global variable number But it is not instructed to the function to use global number variable.
def go_back():
global number #This line needs to be addded
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1
The others answers' solution to add global number in go_back is working, but using global variables is really not a good practice when you can do otherwise.
What you could do here is use object oriented programming. Create a class with a number, lst_img and showimage properties and two class methods, go_forward and go_backward, that can modifiy the number and showimage properties.
How I would start :
class ImageViewer:
# Class constructor
def __init__(self, lst_img):
self.lst_img = lst_img
self.number = 0 # number is always 0 at the beginning
self.showimage = None
def go_forward(self):
if self.number == len(self.lst_img)-1 :
return
else:
self.number += 1
# ... add your code ....
if self.showimage is None:
# code to create a showimage...
self.showimage = .....
else:
# code to update the showimage...
def go_backward(self):
if self.number == 0:
return
else :
self.number -= 1
if self.showimage is None:
# code to create a showimage...
self.showimage = .....
else:
# code to update the showimage...
# Create an viewer instance with a list of images
lst_img = [img1, img2, img3]
viewer = ImageViewer(lst_img)
# Now you can use the go_forward and go_backward methods to naviguate in your images
viewer.go_forward()
viewer.go_forward()
viewer.go_backward()
....
A reason you get the error, local variable 'number' referenced before assignment, is you did not used global keyword to declare that you will use THE number variable even in go_back().
A simple solution is to use global in the go_back(), as follows:
def go_back():
global number # -> as you did in `go_forward()`.
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1 # local variable 'number' referenced before assignment
However, you need to play it safe when using global because it makes hard to track variable changes. Instead, it would be better to pass number value as an argument in the functions.
For more information to use global keyword, see an answer of the question here: Why are global variables evil?
In addition, I recommend you to read this article, Alternatives to Using Globals in Python
The problem is that you are using the number variable as global variable.
Use global number in both of your functions:
lst_img=[img0,img1,img2,img3,img4]
number=0
def go_forward():
global number
number+=1
shwimage.grid_forget()
global shwimage1
shwimage1=Label(image=lst_img[number])
shwimage1.grid(row=0,column=0,columnspan=3)
def go_back():
global number
if number==0:
shwimage.grid_forget()
shwimage1.grid_forget()
shwimage2=Label(image=lst_img[number-1])
shwimage2.grid(row=0,column=0,columnspan=3)
number-=1
Hey im having some trouble understanding what I did wrong/finding a way to fix it, can you guys help me?
def main():
Keys = 0
def Function1():
global all
def Function2():
global all
print(str(Keys))
Function2()
Keys = Keys + 1
Function1()
main()
every time i try to run this i get this error "free variable 'Keys' referenced before assignment in enclosing scope"
Thanks in advance!
You need to define global Keys for every function. A function thinks that Keys is a local variable.
def main():
global Keys
Keys = 0
def Function1():
global Keys
global all
def Function2():
global Keys
global all
print(str(Keys))
Function2()
Keys = Keys + 1
Function1()
main()
However, using global is bad. Here are a list of reasons why using global is bad
So, instead of using global, you can pass it as an parametre.
def main():
Keys = 0
def Function1(Keys):
def Function2(Keys):
print(str(Keys))
Function2(Keys)
Keys = Keys + 1
Function1(Keys)
main()
Also, all is a function in python. There is absolutely no need to make it global
This question already has answers here:
Using global variables in a function
(25 answers)
Closed 1 year ago.
Sorry for the beginner question. In the below code, the output I'm getting is "Original" and not "Function". Doesn't the value of name change after passing through the function? Thanks
global name
name = "Original"
def test():
name = "Function"
test()
print(name)
Use the global keyword in the function.
name = "Original" # define name
def test(): # define our function
global name # this function can now change name
name = "Function" # change the value
test() # run the function
print(name) # returns Function
I'd assume global needs to be in the function so you could do something like this, where a function can use text without effecting the text var:
text = "Original"
def test():
global text
text = "Function"
def printText(text):
textToPrint = text # use text var without any issues in this function
print(textToPrint)
test()
print(text)
global declarations go inside the function you want to apply them to, not at the top-level.
name = "Original"
def test():
global name
name = "Function"
test()
print(name)
name = "Original" #global variable
def test():
#to update the global value you have to declare it here
global name
name = "Function"
test()
print(name)
you can read more about it here, https://www.programiz.com/python-programming/global-keyword
I'm writing a program in selenium python. I pasted here part of the code from my program (I did not paste all the code because it has 800 lines) with the UnboundLocalError error: local variable 'i' referenced before assignment, the error occurs exactly at i += 1.
global i
i = 0
odpowiadanieobserwowaniestronfb0()
def odpowiadanieobserwowaniestronfb0():
if i > ileraz:
driver.quit
skonczono()
'''
try:
testt = driver.find_element_by_xpath('')
except Exception:
odpowiadanieobserwowaniestronfb1()
zleskonczono1()
'''
def odpowiadanieobserwowaniestronfb1():
i += 1
global keyword tells the function, not the whole module / file, what variables should be considered declared outside the scope of the said function. Try this:
def odpowiadanieobserwowaniestronfb1():
global i
i += 1
There are two options:
You can use your global variable:
def odpowiadanieobserwowaniestronfb1():
global i
i += 1
or you pass the i to the function:
def odpowiadanieobserwowaniestronfb1( i ):
return i += 1
I get error UnboundLocal: Local variable T referenced before assignment, however it's not like that:
import ...
T = 0
def do_something():
do_something_else(T) # err at this line
T += 1
def do_something_else(t):
print t
do_something()
That is how my code looks, so it is not reference before assignment. (correct me if I am wrong) What's wrong?
Declare T as global variable:
def do_something():
global T # <--------------
do_something_else(T) # err at this line
T += 1