Unbound error, local variable referenced before assignment
我在做一个小游戏来取乐。我想使用一个函数,它位于我创建的函数文件中,称为functionala。
问题函数
1 2 3 4 5 6 | Traceback (most recent call last): File"C:\Users\seanm\Desktop\Programming\The mists of Alandria\Mists_of_alandria.py", line 22, in <module> functionala2.attack() File"C:\Users\seanm\Desktop\Programming\The mists of Alandria\functionala2.py", line 27, in attack variablestamina += 2 UnboundLocalError: local variable 'variablestamina' referenced before assignment |
功能文件的新版本和改进版本似乎是导致问题的原因:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | variablestamina = 20 variablehealth = 40 variablemonsterhealth = 30 variableattacktype1 = ("Lightattack") variableattacktype2 = ("Mediumattack") variableattacktype3 = ("Heavyattack") def attack(): variableattackquery = input("You can execute three types of attacks. Lightattack does 2 damage and takes no stamina. Mediumattack does 4 damage and takes 2 stamina. Heavyattack does 7 damage and takes 5 stamina. You can only do one per turn:") if variableattackquery == variableattacktype1: variablemonsterhealth -= 2 variablestamina -= 2 if variableattackquery == variableattacktype2: variablemonsterhealth -= 4 variablestamina -= 4 if variableattackquery == variableattacktype3: variablemonsterhealth -= 7 variablestamina -= 7 variablestamina += 2 variablestamina = min(20, variablestamina) print ("The"+monster+" has"+str(variablemonsterhealth)+" health left") print ("You have"+str(variablestamina)+" stamina left") monsterattack = random.randrange(4,6) variablehealth -= monsterattack print ("The"+monster+" attacks you for"+str(monsterattack)) print ("You have"+str(variablehealth)+" health left") print() |
这似乎是一种更清洁的方法,所有这些都在一个文件中。你可能想看看使用类。
从控制台打电话给
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | from random import randrange def game(): stamina = 20 health = 40 monsterhealth = 30 monster = 'orc' attacks = {'light':(-2,0),'medium':(-4,-2),'heavy':(-7,-4)} while True: a = input('you can execute 3 types of attacks, light, medium or heavy... pick one.') a = a.lower().strip() if a in attacks: stamina, health, monsterhealth = attack(stamina, health, monsterhealth, monster, attacks[a]) if stamina <= 0: print 'you have died...' break elif monsterhealth <= 0: print 'the {} has died...'.format(monster) break else: break def attack(stamina, health, monsterhealth, monster, att): monsterhealth += att[0] stamina += att[1] stamina = min(20, stamina) print('the {} has {} health remaining'.format(monster,monsterhealth)) print('you have {} stamina remaining'.format(stamina)) ma = randrange(4,6) health -= ma print('the {} attacks you for {}'.format(monster,ma)) print('you have {} health left'.format(health)) return stamina, health, monsterhealth |
注意:即使在一个文件中这样做,您也需要将变量范围设置为"主"过程(
1 2 3 | m = 1 def foo(): m += 1 '## m doesn't exist within scope of foo, so it will raise the same error |
但是,这可能会令人困惑,以下内容不会引发错误:
1 2 3 | m = 1 def foo(): print m |
也不会:
1 2 3 4 | m = 1 def foo(): a = m print a |
但这两种方法看起来都有点像hack-y,通常最好将值从主过程传递到被调用的函数/方法/etc,并向调用者返回适当的值。