在分配之前引用错误“局部变量”-如何解决?

时间:2019-03-23 14:52:18

标签: python subroutine

我正在制作一个赌博程序(我知道这不应该那么难),并且希望有多个包含在子程序中的游戏。但是,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 个答案:

答案 0 :(得分:1)

原因是losses被定义为全局变量。松散地说,在函数(局部作用域)中,您可以读取全局变量,但不能修改它们。

这将起作用:

losses = 0

def f():
    print(losses)

f()

这不会:

losses = 0

def f():
    losses += 1

f()

如果希望变量具有局部作用域,则应在函数主体中内部中分配变量。如果您明确想要修改全局变量,则需要在函数体中使用global losses进行声明。

答案 1 :(得分:1)

变量winsmoneylossesfiftyfifty()函数范围之外声明,因此除非您明确声明它们,否则不能从函数内部更新它们像这样的全局变量:

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