不一致的“ UnboundLocalError:赋值之前引用的本地变量”错误,且该变量在函数内部定义

时间:2018-11-23 08:52:11

标签: python python-3.x function

我一直在使用 Python 制作一个简单的Text RPG,偶尔但并非每次都遇到错误。

有时候,当我经历序列时,要打起来,会给我以下错误:

nil

nil

该错误始终是由于fightScreen()函数内部的 101行引起的:

UnboundLocalError: local variable referenced before assignment

我已经用Google搜索和搜索Stack Overflow,发现函数试图重新定义变量而不是使用以前的变量是一个问题,但在我的情况下,变量(字典)是在函数本身内部定义的。

我不知道是什么原因造成的,尤其是为什么它仅有时

最小示例(我认为此块可能与问题有关)

enemy name not defined

这是完整的代码

enemy["level"] = player["level"]

1 个答案:

答案 0 :(得分:1)

我们只需要看以下几行:

def fightScreen():
  if randomEnemy() == "Goblin":
    enemy = …
  elif randomEnemy() == "Slime":  
    enemy = …
  enemy["level"] = player["level"]

一个简单的问题:如果randomEnemy()返回的不是“妖精”或“史莱姆”,该怎么办?在这种情况下,enemy未定义。

或者,因为这不可能发生,所以在第一次调用中返回"Slime",但是在第二次调用中返回"Goblin"?然后,您有enemy未定义,就会发生错误。

简单的解决方案:

def fightScreen():
  enemyName = randomEnemy()
  if enemyName == "Goblin":
    enemy = …
  elif enemyName == "Slime":  
    enemy = …

或者,只要这些确实是唯一的选择:

def fightScreen():
  if randomEnemy() == "Goblin":
    enemy = …
  else:
    enemy = …

但是我会提出一个完全不同的概念:让你的敌人成为阶级。

那么你有类似的东西

…
class Goblin(object):
    def __init__(self):
        self.name = "Goblin"
        self.level = 1
        self.ATK = 2
        self.DEF = 2
        self.curHP = 5
        self.maxHP = 5

    def print(self):
      print ("--------------------[FIGHT]-------------------")
      print ("|                .                            |")
      print ("|               |                  | .        |")
      print ("|              |                  |//         |")
      print ("|             |  \       /       /  /         |")
      print ("|             |___\     /____  /   /          |")
      print ("|            | \°_\     /°__/ /   /           |")
      print ("|            '               |  /             |")
      print ("|             |   (° °)       -               |")
      print ("|              | _________    |               |")
      print ("|               ||ˇˇˇˇˇˇˇ|   .|               |")
      print ("|               | -------   |                 |")
      print ("|                |_________|                  |")
      print ("|_____________________________________________|")

        …

class Slime(object):
    def __init__(self)
        self.name = "Slime"
        self.level = 1
        self.ATK = 1
        self.DEF = 3
        self.curHP = 5
        self.maxHP = 5
    def print(self):
      print ("--------------------[FIGHT]-------------------")
      print ("|                       ______                |")
      print ("|                ______/      \_              |")
      print ("|              _/               \             |")
      print ("|             /    \     /       \_           |")
      print ("|            /    0       0        \          |")
      print ("|           /                       \         |")
      print ("|           /        ____            |        |")
      print ("|          /                         |        |")
      print ("|          /                          \       |")
      print ("|         /____________________________\      |")
      print ("|                                             |")
      print ("|                                             |")
      print ("|_____________________________________________|")


def randomEnemy():
  monsters = [Goblin, Slime]
  random_enemy = random.choice(monsters)
  return random_enemy() # instantiate the enemy here

# fighting -----------------------
def fightScreen():
  enemy = randomEnemy()
  …

这要优雅得多。