赋值错误前引用的局部变量

时间:2013-06-17 21:29:57

标签: python global-variables

我正在使用python中的基于文本的游戏。我遇到了一个小问题。我的一个类方法告诉程序当敌人攻击时该怎么做。这是代码

def attack(self, method):
    user_health_old = user_health
    self.method = method
    probs = random.randrange(1,100)
    if method == "Knife":
        while user_health > 0:
            if probs in range(1,70):
                attackWin = True
                break
            else:
                attackWin = False
                pla = player()
                pla.healthRem(7)
            if user_health < 1:
                death()
    elif method == "Hands":
        while plaHealth > 0:
            if probs in range(1,40):
                attackWin = True
                break
            else:
                attackWin = False
                pla.healthRem(7)
            if user_health < 1:
                death()
    pla = player()
    pla.attackStatus()

player()是类,这个方法是攻击() attackStatus()有点块后会告诉玩家战斗中发生的事情,这是代码

def attackStatus(self):
    if attackWin == True:
        print "You Win, this time"
        time.sleep(2)
    if user_health < user_health_old:
        print "But you're victory did come at a cost"
        time.sleep(2)
        print "You're new health value is: ",user_health
        time.sleep(3)

还有几行代码,而不是运行整个程序,我只是设置它来运行这个模块,

pla = player()
pla.attack("Knife")

运行程序时出现问题。它会打开控制台,但会立即退出。它也不输出任何信息。我不太清楚发生了什么,如果有人可以帮助我,我会非常感激。

1 个答案:

答案 0 :(得分:0)

当您使用else时,在第一个函数的pla.healthRem(7)块中,您在为其分配值之前引用pla。通过查看其他代码,您可能希望在此行的上方添加pla = player()(或者可以在函数的最开头添加pla = player())。

修改:看到您的评论后,这肯定与您在函数pla中使用attack()有关。如果您在函数中分配了名称​​ where ,那么它将被视为该函数中的本地变量无处不在。这意味着如果函数体中有pla,则永远不能访问全局名称pla = player()。您可以通过以下方式之一解决此问题:

  • 从您的函数中取出所有pla = player()行,这将允许查找pla以查找全局变量。
  • global pla放在函数的最顶层,全局语句将导致对该名称的每个赋值都修改变量的全局版本,而不是创建新的局部变量。
  • 当您需要播放器实例时,请停止尝试使用全局,只需在函数内使用pla = player()