关于python:未绑定错误,在赋值之前引用的局部变量

Unbound error, local variable referenced before assignment

我在做一个小游戏来取乐。我想使用一个函数,它位于我创建的函数文件中,称为functionala。

问题函数attack()不起作用,程序因错误而崩溃:

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()


这似乎是一种更清洁的方法,所有这些都在一个文件中。你可能想看看使用类。

从控制台打电话给game()开始游戏,就是这样。游戏将在怪物或你的健康状态<=0时结束。

代码:

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

注意:即使在一个文件中这样做,您也需要将变量范围设置为"主"过程(game),并将它们传递给attack函数。否则,引用这些名称将引发相同的错误,您可以这样复制:

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,并向调用者返回适当的值。