-2

I keep getting this error:

UnboundLocalError: local variable 'tickets_per_person' referenced before assignment.

However I have assigned the variable tickets_per_person as a global variable at the top of my code so i do not understand why it isn't being recognized.

The full function is:

def date_price_increase() :
    if 'July' or 'August' or 'September' in full_date :
        tickets_per_person = tickets_per_person * 1.15
    elif 'February' or 'October' or 'November'in full_date :
        tickets_per_person = tickets_per_person * 0.95
    else :
        tickets_per_person = tickets_per_person    

Assigning the global variable :

global tickets_per_person
tickets_per_person = 0

The traceback is:

Exception in Tkinter callback
Traceback (most recent call last):
  File 
"C:\Users\samue\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", 
line 1705, in __call__
    return self.func(*args)
  File "C:\Users\samue\OneDrive - The Becket 
School\Airport_Tkinters_GUI_29.12.18.py", line 485, in cost
    date_price_increase()
  File "C:\Users\samue\OneDrive - The Becket 
School\Airport_Tkinters_GUI_29.12.18.py", line 325, in date_price_increase
   tickets_per_person = tickets_per_person * 1.15
UnboundLocalError: local variable 'tickets_per_person' referenced before 
   assignment
vvvvv
  • 25,404
  • 19
  • 49
  • 81
Sam White
  • 7
  • 2
  • 2
    You need to declare the variable global inside the function. When you assign to it inside the function, it creates a local variable with the same name unless you have declared it global inside the function. See [this answer](https://stackoverflow.com/questions/423379/using-global-variables-in-a-function). – evergreen May 01 '19 at 11:20
  • you have to use `global tickets_per_person` inside `def date_price_increase():` to inform function that you want to assign to global variable, not to local one. There is no need to use word `global` outside functions because all variables created outside functions are global. – furas May 01 '19 at 12:00

1 Answers1

2

You have to use global tickets_per_person inside def date_price_increase(): to inform function that you want to use global variable tickets_per_person instead of local one.

def date_price_increase() :

    global tickets_per_person

    if 'July' or 'August' or 'September' in full_date :
        tickets_per_person = tickets_per_person * 1.15
    elif 'February' or 'October' or 'November'in full_date :
        tickets_per_person = tickets_per_person * 0.95
    else :
        tickets_per_person = tickets_per_person   

There is no need to use word global outside functions because all variables created outside functions are global.


EDIT: you should create normal function with parameters and return. It is prefered method.

def date_price_increase(tickets_per_person, full_date):

    if 'July' or 'August' or 'September' in full_date:
        tickets_per_person = tickets_per_person * 1.15
    elif 'February' or 'October' or 'November'in full_date:
        tickets_per_person = tickets_per_person * 0.95
    else:
        tickets_per_person = tickets_per_person   

    return tickets_per_person

and run

tickets_per_person = date_price_increase(tickets_per_person, full_date)
furas
  • 134,197
  • 12
  • 106
  • 148
  • this didnt seem to work as i have referenced it in multiple functions so I tried to place it outside the function at the top. I tried your method but this error came up :UnboundLocalError: local variable 'tickets_per_person' referenced before assignment – Sam White May 01 '19 at 12:40
  • 1
    you can't get this error if you have `global tickets_per_person` inside function. OR maybe you use this variable in another function - then you have to use `global tickets_per_person` in another function too. In traceback you should see in which function you have problem. You may have this error also if you have typo in variable - so it uses different variable with `global`. – furas May 01 '19 at 12:44
  • so i need to put 'global tickets_per_person' inside every function – Sam White May 01 '19 at 13:03
  • you have to use `'global tickets_per_person` in every function where you use `tickets_per_person`. Or create normal function with parameters `def date_price_increase(tickets_per_person, full_date):` and with result `return tickets_per_person` and run as `tickets_per_person = date_price_increase(tickets_per_person, full_date)` – furas May 01 '19 at 13:15