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

Python 赋值错误前引用的局部变量,python,global-variables,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:

我正在用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()

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

在您使用
pla.healthRem(7)
时,在第一个函数的
else
块中,您正在引用
pla
,然后才给它赋值。通过查看其他代码,您似乎希望将
pla=player()

编辑:看到您的评论后,这肯定与您在函数
attack()
中使用
pla
有关。如果在函数中的任何位置都有对名称的赋值,则该名称在该函数中的任何位置都被视为局部变量。这意味着,如果函数体中有
pla=player()
,则永远无法访问全局名称
pla
。您可以通过以下方式之一修复此问题:

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

发布完整的回溯。您的变量
user\u health
从未在您向我们展示的代码中初始化过,以及
break
语句中没有循环的内容是什么?@我看到的所有
break
语句都在
while
循环中。呃,我真是太傻了;没关系。奇怪的是,我在程序的一开始就将pla=player()定义为一个全局变量。我想我也定义过几次,但都是相同的值。请看我的编辑,你不能在函数中指定一个变量名,而仍然使用相同名称的全局变量。谢谢你,我可以通过像你说的那样删除全局pla来修复它。
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")