为什么我的代码会出现此错误?

问题描述:

我是一名开始Python程序员,刚刚完成我的第一个程序Battle。 但我有问题。至于我可以看到,所有的代码工作,除了接近尾声的一部分罚款,在那里我得到一个UnboundLocalError,一起来看看:为什么我的代码会出现此错误?

Traceback (most recent call last): 
File "[Dir]\Programs\Battle.py", line 210, in <module> 
callUserCombat() 
File "[Dir]\Programs\Battle.py", line 26, in callUserCombat 
playerLeft = str(playerLeft) 
UnboundLocalError: local variable 'playerLeft' referenced before assignment 

而这正是它引用(不小的金额,对不起):

#Define callUserCombat(). 
def callUserCombat(): 
    print('Your turn.') 
    time.sleep(2) 
    print() 
    print('Choose a move:') 
    print('Attack 1 [2 - 3 Damage] (1)') 
    print('Attack 2 [0 - 5 Damage] (2)') 
    print('Heal [Heals 0 - 6] (3)') 
    playerLeft = str(playerLeft) 
    enemyLeft = str(enemyLeft) 
    print('Your HP: ' + playerLeft) 
    print('Enemy HP: ' + enemyLeft) 
    chosenAttack = input() 

    while chosenAttack != '0': 
     if chosenAttack == '1': 
      chosenAttackPower = random.randint(2,3) 
      enemyLeft = - chosenAttackPower 
      chosenAttackPower = str(chosenAttackPower) 
      print('You attacked!') 
      print('Enemy lost ' + chosenAttackPower + 'HP. ') 
      break 

     if chosenAttack == '2': 
      chosenAttackPower = random.randint(0,5) 
      enemyLeft = - chosenAttackPower 
      chosenAttackPower = str(ChosenAttackPower) 
      print('You attacked!') 
      print("Enemy lost " + chosenAttackPower + 'HP. ') 
      break 

     if chosenAttack == '3': 
      chosenAttackPower = random.randint(1,5) 
      playerLeft = + chosenAttackPower 
      chosenAttackPower = str(ChosenAttackPower) 
      print('You healed!') 
      print('Healed ' + chosenAttackPower + 'HP.') 
      break 

     else: 
      chosenAttack = '0' 
      print('Please enter a valid move code.') 
      print("Attack 1 (1)") 
      print("Attack 2 (2)") 
      print("Heal (3)") 
      print() 
      chosenAttack = input() 
     limitHealth() 

#Define callEnemyCombat(). 
def callEnemyCombat(): 
    print('Enemy\'s turn.') 
    time.sleep(2) 
    print() 
    enemyAttack = random.randint(1,6) 
    if enemyAttack == '1': 
     enemyAttackPower = random.randint(2,3) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('Don\'t bother taunting me, you\'ll die trying. And it\'s mean.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '2': 
     enemyAttackPower = random.randint(2,3) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('Where do you live? I only want to know so I can kill') 
     print('your family once I\'m finished with you.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '3': 
     enemyAttackPower = random.randint(2,3) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('I can take anything you can throw at me. Except Chocolate.') 
     print('I\'m allergic to Chocolate.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '4': 
     enemyAttackPower = random.randint(0,5) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('I WILL kill you, even if I have to hire the Men in Black to do it.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '5': 
     enemyAttackPower = random.randint(0,5) 
     playerLeft = - enemyAttackPower 
     enemyAttackPower = str(enemyAttackPower) 
     print('Have you heard of pong? We could play pong after I kill you,') 
     print('if you like.') 
     print('Enemy attacked!') 
     print('You lost ' + enemyAttackPower + 'HP. ') 

    if enemyAttack == '6': 
     enemyAttackPower = random.randint(1,5) 
     enemyLeft = + enemyAttackPower 
     enemyAttackPower = str(ChosenAttackPower) 
     print('Charging up with a cold glass of water, and a side of you.') 
     print('Enemy healed!') 
     print('Healed ' + chosenAttackPower + 'HP.') 
    limitHealth() 

#Define limitHealth(). 
def limitHealth(): 
    if playerLeft > playerHealth: 
     playerLeft = playerHealth 

    if enemyLeft > enemyHealth: 
     enemyLeft = enemyHealth 

这里是代码,因此,所有有意义: (https://www.dropbox.com/s/9l4ifgmk5sx1pg1/Battle.py)。

编辑:对这篇文章感到抱歉,它似乎是相当可怕的书面,所以我修好了。

+3

当错误发生时,请解开你的代码的相关作品(+ - 5-7线)和包括它变成你的问题。 – akluth 2013-04-26 08:01:08

+0

有一个'playerLeft'在_module_级别定义,但不在函数中 - 看起来像一个范围问题?... – Basic 2013-04-26 08:19:09

+0

@基本你可以写出答案。我删除了我的。不想拿你的信用。 – CppLearner 2013-04-26 08:22:43

这是一个范围可变问题。你需要为这样的输入您的全局变量:

enemyHealth = 1 
playerLeft = 2 
enemyLeft = 2 
... 

#Define callUserCombat(). 
def callUserCombat(): 
    global enemyHealth 
    global playerLeft 
    global enemyLeft 
    etc. 
+7

答案可以解决问题,但不使用'global'就可以重写代码,这将是更好的选择。 – Matthias 2013-04-26 08:31:07

+0

我不认为这是一个范围问题。因为我已经运行了一些代码而不使用'global'。 http://pastie.org/7723221#2。我使用'SPROUT ='@''而不使用'全局' ' – Moj 2013-04-26 08:39:12

+0

@Matthias:我刚刚回答了OP问题“为什么我的代码会出现此错误?”。但我同意你的看法:可变全局变量是危险的。 – lucasg 2013-04-26 08:49:52

绝对是有范围的问题,更具体地说,在蟒蛇试图解决分配给它(时名的方式,即当你试图给变量分配playerLeft)。你可以看这里:http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python/了解完整的说明。

由于您似乎只是试图打印全局变量的值,所以我们需要输入playerLeft。只要做到这一点,正是:

playerLeft = 2 
enemyLeft = 2 
... 

#Define callUserCombat(). 
def callUserCombat(): 

    ... 
    print('Your HP: ', playerLeft) 
    print('Enemy HP: ', enemyLeft) 

    ... 

应避免问题