Получение ошибки "локальная переменная, на которую ссылаются перед присваиванием - как исправить? - PullRequest
1 голос
/ 23 марта 2019

Я делаю игровую программу (я знаю, что это не должно быть невероятно сложно), и хочу иметь несколько игр, которые будут в подпрограммах. Тем не менее, python, кажется, считает, что мои переменные назначаются в странных местах.

Я наполовину новичок в подпрограммах, и у меня все еще есть проблемы здесь и там. Вот с чем я работаю:

# variables and subroutines
money = 500
losses = 0
wins = 0
wlr = (wins,':',losses)
egg = True

def fiftyfifty(bet):
    chance = random.randint(0,100)
    if chance > 50:
        losses += 1
        print('You lose!')
        money -= bet
        print('You now have ',money)
        return
    else:
        wins += 1
        print('You win!')
        money += bet
        print('You now have ',money)
        return

А вот как это называется:

elif gamechoice == 'fifty fifty':
        print('You have $',money,'\n')
        t(1)
        bet1 = money+1
        while bet1 > money:
            bet1 = int(input('How much do you want to bet?\n'))
        fiftyfifty(bet1)

Я ожидаю, что это просто пройдет, добавит счет в выигрыш или проигрыш, а затем обновит деньги. Тем не менее, я получаю эту ошибку: UnboundLocalError: local variable 'losses' referenced before assignment Если я выигрываю, он говорит то же самое с local variable 'wins'.

Как показано, все переменные назначаются вверху, а затем на них ссылаются ниже в подпрограммах. Я совершенно не уверен в том, как python думает, что я ссылался на него перед назначением?

Буду признателен за любую помощь, заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Причина в том, что losses определяется как глобальная переменная. Внутри функций (локальная область) вы можете, грубо говоря, читать глобальные переменные, но не изменять их.

Это будет работать:

losses = 0

def f():
    print(losses)

f()

Это не будет:

losses = 0

def f():
    losses += 1

f()

Вам следует присвоить переменным в пределах ваше тело функции, если вы хотите, чтобы они имели локальную область видимости. Если вы явно хотите изменить глобальные переменные, вам нужно объявить их, например, global losses в теле функции.

1 голос
/ 23 марта 2019

Переменные wins, money и losses были объявлены вне области действия функции fiftyfifty(), поэтому вы не можете обновить их внутри функции, если вы явно не объявите их как глобальные переменные, такие как:

def fiftyfifty(bet):
    global wins, money, losses
    chance = random.randint(0,100)
    if chance > 50:
        losses += 1
        print('You lose!')
        money -= bet
        print('You now have ',money)
        return
    else:
        wins += 1
        print('You win!')
        money += bet
        print('You now have ',money)
        return 
...