Home > Mobile >  UnboundLocalError: local variable var referenced before assignment - how to debug
UnboundLocalError: local variable var referenced before assignment - how to debug

Time:12-15

I'm working through a tutorial based on this and have hit this error.

Trying to work up my skill in Python and am not sure how to debug this because the error confuses me. Can someone help, please?

import random

MAX_LINES = 3
MAX_BET = 100
MIN_BET = 1

ROWS = 3
COLS = 3

symbol_count = {
    "A": 2,
    "B": 4,
    "C": 6,
    "D":8
}

symbol_value = {
    "A": 5,
    "B": 4,
    "C": 3,
    "D":2
}

def check_winnings(columns, lines, bet, values):
    winnings - 0
    winning_lines = []
    for line in range(lines):
        symbol = columns[0][line]
        for column in columns:
            symbol_to_check = column[line]
            if symbol != symbol_to_check:
                break
        else:
            winnings  = values[symbol] * bet
            winning_lines.append(lines  1) # Add one because index starts at 0 and it needs to start at 1
    
    return winnings, winning_lines 
     

def get_slot_machine_spin(rows, cols, symbols):
    all_symbols = []
    for symbol, symbol_count in symbols.items():
        for _ in range(symbol_count): #The _ is an anonymous value
            all_symbols.append(symbol)
    #print(all_symbols)
  
    columns = []
    for _ in range(cols):
        column = []
        current_symbols = all_symbols[:]# This creates a copy of all symbols
        for _ in range(rows):
            value = random.choice(current_symbols)
            current_symbols.remove(value)
            column.append(value)
        columns.append(column)
    return columns

def print_slot_machine(columns):
    for row in range(len(columns[0])):
        for i,column in enumerate(columns):
            if i != len(columns) - 1:
                print(column[row], end = " | ")
            else:
                print(column[row], end="")
        print()
def deposit():
    while True:
        amount = input("What would you like to deposit?")
        if amount.isdigit():
            amount = int(amount)
            if amount > 0:
                break
            else:
                print("Amount must be greater than zero.")
        else:
            print("Please enter a number.")
    return amount

def get_number_of_lines():
    while True:
        lines = input("Enter the number of lines to bet on (1-"   str(MAX_LINES)   "? ")
        if lines.isdigit():
            lines = int(lines)
            if 1 <= lines <= MAX_LINES:
                break
            else:
                print("Enter a valid number of lines.")
        else:
            print("Please enter a number.")
    return lines

def get_bet():
    while True:
        amount = input("How much would you like to bet on each line?")
        if amount.isdigit():
            amount = int(amount)
            if MIN_BET <= amount <= MAX_BET:
                break
            else:
                print(f"Amount must be between {MIN_BET} - {MAX_BET}.")
        else:
            print("Please enter a number.")
    return amount
    


def main():
    balance = deposit()
    lines = get_number_of_lines()
    while True:
        bet = get_bet()
        total_bet = bet * lines
        if total_bet > balance:
            print (f"You do not have enough cash to pay the bet from your balance. Your current balance is {balance}")
        else:
            break
    slots = get_slot_machine_spin (ROWS, COLS, symbol_count)
    print_slot_machine(slots)
    winnings, winning_lines = check_winnings(slots, lines, bet,  symbol_value)
    print(f"You won {winnings}")
    print(f"You won on", *winning_lines) #splat or unpack operator
    return

main()

The output at runtime is:

What would you like to deposit?100
Enter the number of lines to bet on (1-3? 3
How much would you like to bet on each line?3
A | B | D
B | C | C
D | A | C

But then I get this traceback...

UnboundLocalError                         Traceback (most recent call last)
/var/folders/v_/yq26pm194xj5ckqy8p_njwc00000gn/T/ipykernel_54333/4159941939.py in <module>
    122     return
    123 
--> 124 main()

/var/folders/v_/yq26pm194xj5ckqy8p_njwc00000gn/T/ipykernel_54333/4159941939.py in main()
    117     slots = get_slot_machine_spin (ROWS, COLS, symbol_count)
    118     print_slot_machine(slots)
--> 119     winnings, winning_lines = check_winnings(slots, lines, bet,  symbol_value)
    120     print(f"You won {winnings}")
    121     print(f"You won on", *winning_lines) #splat or unpack operator

/var/folders/v_/yq26pm194xj5ckqy8p_njwc00000gn/T/ipykernel_54333/4159941939.py in check_winnings(columns, lines, bet, values)
     23 
     24 def check_winnings(columns, lines, bet, values):
---> 25     winnings - 0
     26     winning_lines = []
     27     for line in range(lines):

UnboundLocalError: local variable 'winnings' referenced before assignment

How do I unpack this?

CodePudding user response:

Did you mean to write

winnings = 0

instead of

winnings - 0

What you wrote subtracts zero from the winnings variable which does not exist yet.

  • Related