我正在制作一个赌博程序(我知道这不应该那么难),并且希望有多个包含在子程序中的游戏。但是,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认为我在分配之前引用了它吗?
我将不胜感激,谢谢您!
答案 0 :(得分:1)
原因是losses
被定义为全局变量。松散地说,在函数(局部作用域)中,您可以读取全局变量,但不能修改它们。
这将起作用:
losses = 0
def f():
print(losses)
f()
这不会:
losses = 0
def f():
losses += 1
f()
如果希望变量具有局部作用域,则应在函数主体中内部中分配变量。如果您明确想要修改全局变量,则需要在函数体中使用global losses
进行声明。
答案 1 :(得分:1)
变量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