【问题标题】:local variable referenced before assignment error赋值错误前引用的局部变量
【发布时间】:2013-06-18 05:51:57
【问题描述】:

我正在使用 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()是类,这个方法是attack() 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)

还有几行代码,我没有运行整个程序,而是设置了 atm 来运行这个模块,

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

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

【问题讨论】:

  • 发布完整的回溯。
  • 您的变量user_health 从未在您向我们展示的代码中初始化
  • 没有循环的break 语句是怎么回事?
  • @kindall 我看到的唯一break 语句在while 循环中。
  • 呃,我太傻了;没关系。

标签: python global-variables


【解决方案1】:

当您使用pla.healthRem(7) 时,在您的第一个函数的else 块中,您在为其分配值之前引用了pla。从其他代码来看,您似乎想在这一行上方添加pla = player()(或者可能将pla = player() 放在函数的最开头)。

编辑:看到你的评论,这肯定和你在函数attack()中使用pla有关。如果您在函数中为名称 anywhere 赋值,则它被视为该函数中的局部变量 everywhere。这意味着如果函数体中有pla = player(),则永远无法访问全局名称pla。您可以通过以下方式之一解决此问题:

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

【讨论】:

  • 奇怪的是,我在程序一开始就将 pla = player() 定义为全局变量。我想我也定义了几次,但它是相同的值。
  • 看我的编辑,你不能在你的函数内部分配一个变量名并且仍然使用一个同名的全局变量。
  • 谢谢你,我可以通过像你说的那样将全局 pla 全部删除来解决它。
猜你喜欢
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2011-11-06
  • 2018-01-12
相关资源
最近更新 更多