Python Forum
How to fix UnboundLocalError
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How to fix UnboundLocalError
#1
The code below models a simple game that tests if an input occurs in the list. The function is called twice, then the total # of correct answers is printed.

foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"]
answers_right = 0

def finder(bone_name):
    if bone_name.lower() in foot_bones:
        print("correct!")
        answers_right += + 1
    else:
        print("incorrect")
        
finder(input("enter name of a bone: "))
finder(input("enter name of another bone: "))

print("number of foot bones correctly identified: ", answers_right)
Code returns no error when the input is "incorrect", but gives an UnboundLocalError when a correct one is passed. How do I fix it? Simple issue.

Thanks!
Reply
#2
You have an extra "+" in line 7

        answers_right += 1
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#3
When a variable such as answers_right is on the left hand side of an assignment operator in a function, it becomes a local variable of this function. It means that the answers_right variable in function finder() is not the same as the global variable answers_right. Python complains because you are incrementing the local variable when this variable doesn't yet have a value.

A way to solve this is to add the statement global answers_right at the top of the finder()'s function body.

It is good practice to avoid global statements in python code, because they obfuscate the code somewhat, but they are allowed.
Reply
#4
(Jan-07-2018, 08:08 AM)Gribouillis Wrote: It is good practice to avoid global statements in python code, because they obfuscate the code somewhat, but they are allowed.

Thanks! That fixed it.

No need to answer further, but would you recommend a different method of keeping track of the answers_right, without resorting to a global variable?
Reply
#5
Using global variables is not recommended.
You can do the same by passing answers_right as an argument to the function.

def finder(bone_name, correct):
    if bone_name.lower() in foot_bones:
        print("correct!")
        correct += 1
    else:
        print("incorrect")
Then call the function.
bone_name = input("enter name of a bone: ")
finder(bone_name, answers_right)
print(answers_right)
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#6
(Jan-07-2018, 04:16 PM)Tawnwen Wrote: would you recommend a different method of keeping track of the answers_right, without resorting to a global variable?
You are reaching the point where you have functions that manipulate external data and you need a way to manage both the data and the function. That's why classes were invented. Here is how you can code this by using a class:

class BoneFinder:
    foot_bones = [
        "calcaneus", "talus", "cuboid",
        "navicular", "lateral cuneiform",
        "intermediate cuneiform", "medial cuneiform",
    ]

    def __init__(self):
        self.answers_right = 0
 
    def examine(self, bone_name):
        if bone_name.lower() in self.foot_bones:
            print("correct!")
            self.answers_right += + 1
        else:
            print("incorrect")

finder = BoneFinder()         
finder.examine(input("enter name of a bone: "))
finder.examine(input("enter name of another bone: "))
 
print("number of foot bones correctly identified: ", finder.answers_right)
In this code, a single entity holds the variable answer_right between subsequent calls. The code looks more complicated than your program but in fact, it is easier to extend by adding new features.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  How does UnboundLocalError work? deanhystad 3 1,633 Feb-25-2022, 01:21 AM
Last Post: bowlofred
  UnboundLocalError: local variable 'wmi' referenced before assignment ilknurg 2 1,856 Feb-10-2022, 07:36 PM
Last Post: deanhystad
  exec + subprocess = UnboundLocalError paul18fr 6 3,443 Feb-04-2021, 06:27 AM
Last Post: Gribouillis
  UnboundLocalError: local variable 'figure_perso' referenced before assignment mederic39 2 2,229 Jun-11-2020, 12:45 PM
Last Post: Yoriz
  UnBoundLocalError Seaninho 3 2,621 May-31-2020, 07:22 AM
Last Post: azajali43
  UnboundLocalError: local variable referenced before assignment svr 1 3,261 Dec-27-2019, 09:08 AM
Last Post: perfringo
  UnboundLocalError: local variable ' ' referenced before assignment d3fi 10 5,433 Sep-03-2019, 07:22 PM
Last Post: buran
  'Exception Has occured: UnBoundLocalError' caston 1 2,415 Jun-12-2019, 02:33 PM
Last Post: perfringo
  UnboundLocalError Problem DrChicken24 1 2,186 Mar-27-2019, 02:53 AM
Last Post: ichabod801
  UnboundLocalError, how to fix it please? etrius 4 3,838 Jan-18-2018, 09:53 PM
Last Post: nilamo

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020