Функция, ошибка UnboundLocalError

Ошибка:

File "source_file.py", line 237, in food
    confirm_amount("Хлеб", 5)

UnboundLocalError: local variable 'confirm_amount' referenced before assignment
money = 100
choose = ""
sausage_amount = 1
sausage = ""
def location(location = "Дом"):
  print("Локация:", location)
def hp():
  if HP % 1 == 0:
    print("Здоровье:", int(HP))
  elif HP % 1 != 0:
    print("Здоровье:", HP)
def balance():
  if money % 1 == 0:
    print("Баланс:", int(money))
  elif money % 1 != 0:
    print("Баланс:", money)
def buy():
  location("Магазин")
  hp()
  balance()
  print()
  print("Покупка:\n")
  print("1: Еда")
  print("2: Инструменты")
  print("3: Оружие")
  print("4: Медикаменты")
  print()
  print("0: Назад\n")
  choose = ""
  choose = input(":")
  print()
  if choose == "1":
    def food():
      location("Магазин")
      hp()
      balance()
      print()
      print("Еда:\n")
      print("1: Колбаса (10 монет, 4 HP")
      print("2: Хлеб (5 монет, 2 HP)")
      print()
      print("0: Назад")
      choose = ""
      choose = input(":")
      print()
      if choose == "1":
        def confirm_amount(food, amount):
          global money
          print("Вы подтверждаете покупку? (ДА или НЕТ)")
          print()
          global sausage
          global sausage_amount
          sausage = str(sausage_amount) + " " + food                          
          print(sausage)
          global inventory
          verify = sausage in inventory
          choose = ""
          choose = input(":")
          print()
          if choose == "ДА":
            if money >= amount:
              if verify == False:
                money -= amount
                inventory.append(sausage)
                print("Ваш инвентарь:")
                print()
                print(inventory)
                print()
                buy()
              elif verify == True:
                money -= amount
                sausage_amount += 1
                index = inventory.index(sausage)
                sausage = str(sausage_amount) + " " + food
                inventory[index] = sausage
                print("Ваш инвентарь:")
                print(inventory)
                print()
                time.sleep(1)
                buy()
            elif money < amount:
              print("Недостаточно средств")
              time.sleep(1)
              buy()
          elif choose == "НЕТ":
            buy()
          else:
            confirm()
        confirm_amount("Колбаса", 10)
      elif choose == "2":
        confirm_amount("Хлеб", 5)

Ответы (1 шт):

Автор решения: 4500zenja

Ваше объявление функции confirm_amount() действительно только для ветви, при которой choose = "1" — для всех остальных ветвей и остального кода данная функция будет всё ещё невидима из-за особенностей области видимости функций и переменных. Более подробно об этом Вы можете прочесть, например, тут.

Для начала попробуйте вынести все объявления функции в общую область видимости, т.е. не внутри каких-либо структур. ну и ещё хотелось бы, чтобы код был намного читабельнее, имхо

→ Ссылка