【问题标题】:Getting error "local variable referenced before assignment - how to fix?获取错误“分配前引用的局部变量 - 如何修复?
【发布时间】:2019-03-23 14:52:17
【问题描述】:

我正在制作一个赌博程序(我知道这应该不会太难),并且想要在子程序中制作多个游戏。但是,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如何认为我在分配之前引用了它?

如果有任何帮助,我将不胜感激,在此先感谢您!

【问题讨论】:

  • 你能把整个代码贴出来吗?
  • pastebin.com/WkrPRPfb - 检查这个 pastebin 以获得整个代码

标签: python subroutine


【解决方案1】:

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

这将起作用:

losses = 0

def f():
    print(losses)

f()

这不会:

losses = 0

def f():
    losses += 1

f()

如果您希望变量具有本地范围,则应将变量分配给函数体。如果您明确要修改全局变量,则需要在函数体中声明它们,例如,global losses

【讨论】:

    【解决方案2】:

    变量winsmoneylosses 是在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 
    

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2016-02-10
      • 2018-07-16
      • 2016-04-07
      • 2014-08-20
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多