2013-07-09 54 views
-3

現在,在您決定拋出一個不閱讀其他問題的窗口之前,我已經搜索了很長時間並且很努力。事實上,我發現了很多答案,但他們在不同的背景下,我真的不知道如何將它們與我的代碼一起使用,因此我得出結論認爲,這會對我更好的利益,而不是浪費時間在其他問題上而不是給我我的問題的答案,詢問我得到的確切的錯誤。UnboundLocalError:分配之前引用的局部變量'gold'

import time 
import random 
inventory = [] 
gold = 0 
rawfish = ["Mackarel", "Cod", "Salmon", "Herring", "Tuna"] 
trash = ["Old Shoe", "Thin Bone", "Rusted Empty Box", "Plank Fragment"] 
special = ["Copper Ring"] 

print" _   _  _  _  ______ _  _  _ "    
print" | |   | |  (_)  ()  | ____(_) | | (_)"    
print" | |  ___ | |_ __ _ _ __ |/ ___ | |__ _ ___| |__ _ _ __ __ _ " 
print" | | /_ \| | '_ \| | '_ \/__| | __| |/__| '_ \| | '_ \/_` |" 
print" | |___| (_) | | |_) | | | | | \__ \ | | | \__ \ | | | | | | | (_| |" 
print" |______\___/|_| .__/|_|_| |_| |___/ |_| |_|___/_| |_|_|_| |_|\__, |" 
print"    | |             __/ |" 
print"    |_|            |___/ " 
time.sleep(2) 
print".  .          /| /|  " 
print" \ /    o      |  |  " 
print" \ / .-. .--..--. . .-. .--.  o |  |  " 
print" \/ (.-' | `--. | ( )| |   |  |  " 
print" '  `--'' `--'-' `- `-' ' `-  o | o |  " 
time.sleep(2) 
print "In this current version the first item in your inventory is sold." 

def sell_function(): 
    if inventory[0] in rawfish: 
     sold = inventory.pop(0) 
     gold = gold+5 
     print "You have sold a", sold, "for 5 gold coins!" 
    elif inventory[0] in trash: 
     sold = inventory.pop(0) 
     gold = gold+5 
     print "You have recycled a", sold, "for 1 gold coins!" 
    elif inventory[0] in special: 
     sold = inventory.pop(0) 
     gold = gold+5 
     print "You have sold a", sold, "for 10 gold coins!" 
    else: 
     print "Shopkeeper:'You can't sell that.'" 

def fish_function(): 
    random_fishingchance = random.randrange(1,32) 
    if 1 <= random_fishingchance < 3: 
     inventory.append("Mackarel") 
     print "You have reeled in a Mackarel!" 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 3 <= random_fishingchance < 5: 
     inventory.append("Cod") 
     print "You have reeled in a Cod!" 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 5 <= random_fishingchance < 7: 
     inventory.append("Salmon") 
     print "You have reeled in a Salmon!" 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 7 <= random_fishingchance < 9: 
     inventory.append("Herring") 
     print "You have reeled in a Herring!" 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 9 <= random_fishingchance < 11: 
     inventory.append("Tuna") 
     print "You have reeled in a Tuna!" 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 11 <= random_fishingchance < 16: 
     inventory.append("Old Shoe") 
     print "You have reeled in an Old Shoe..." 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 16 <= random_fishingchance < 21: 
     inventory.append("Thin Bone") 
     print "You have reeled in a Thin Bone..." 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 21 <= random_fishingchance < 26: 
     inventory.append("Rusted Empty Box") 
     print "You have reeled in a Rusted Empty Box..." 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 26 <= random_fishingchance < 31: 
     inventory.append("Plank Fragment") 
     print "You have reeled in a Plank Fragment..." 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    elif 31 <= random_fishingchance < 32: 
     inventory.append("Copper Ring") 
     print "You have reeled in a ring shaped object covered in mud." 
     print "After cleaning it you notice it is a Copper Ring!" 
     time.sleep(0.5) 
     print "You place it into your inventory" 
    else: 
     print "It seems your fishing line has snapped!" 


def action_function(): 
    while True: 
     action = raw_input("Do you want to 'sell' 'fish' 'inventory' 'money' or 'quit'?") 
     if action == "quit": 
      break 
      end 
     if action == "sell": 
      sell_function() 
     if action == "fish": 
      print "You throw your reel..." 
      time.sleep(10) 
      fish_function() 
     if action == "inventory": 
      print "You begin to open your inventory" 
      time.sleep(0.5) 
      print inventory 
     if action == "money": 
      print gold 
     if action == "gold": 
      print gold 
action_function() 

現在,我得到的錯誤是與「sell_function()」。當我運行程序/遊戲時,一切都奏效,直到我輸入「sell」並輸入。我想要發生的情況是將第一個項目從庫存中刪除,並根據要添加一定數量的「gold」的項目類型。然而,而不是當我這樣做,說到了:

Traceback (most recent call last): 
    File "C:\Users\Lolpin\Desktop\fishinglooptest.py", line 129, in <module> 
    action_function() 
    File "C:\Users\Lolpin\Desktop\fishinglooptest.py", line 116, in action_function 
    sell_function() 
    File "C:\Users\Lolpin\Desktop\fishinglooptest.py", line 43, in sell_function 
    gold = gold+5 
UnboundLocalError: local variable 'gold' referenced before assignment 
+1

這裏有一些嚴重的打印問題。 – arshajii

+0

...和一些嚴重的字典/列表赤字的跡象... – tamasgal

回答

1

由於此行gold = gold+5蟒蛇認爲gold是一個局部變量將不會從全局變量gold取的gold值當你真正調用函數sell_function()

發生這種情況是因爲函數中的局部變量是在解析函數定義時決定的。

使用global聲明,如果你想修改一個全局變量:

def sell_function(): 
    global gold 
    if inventory[0] in rawfish: 
     sold = inventory.pop(0) 
     gold = gold+5 
+0

當我寫'全球黃金=黃金+ 5'它驚歎「語法錯誤」 – Lolpin

+0

@Lolpin你讀過答案中的代碼?你*必須*有一行包含* only *'global gold',它聲明「gold」是一個全局變量。 *之後*做'黃金=黃金+ 5'將按照您的預期工作。 – Bakuriu

+0

@Lolpin只需在函數頂部添加一行'global gold',然後正常使用gold。 –

1

回放功能範圍。既然你給黃金分配了一個新的值,python會創建一個新的變量。然後你嘗試將它增加5,所以它試圖採用新的「黃金」的價值,這引發了錯誤。

UnboundLocalError: local variable 'gold' referenced before assignment 

在所有改變它的函數中聲明'gold'作爲全局變量。

global gold 
if inventory[0] in rawfish: 
+0

謝謝,我現在明白了:D – Lolpin

相關問題