-3

他の質問を読まないという理由であなたが私を窓から追い出すと決める​​前に、私はこれを長く懸命に探しました。私は実際に多くの答えを見つけましたが、それらは異なるコンテキストにあり、コードでそれらを使用する方法がよくわからないため、他の質問に時間を浪費する代わりに、それが私のより良い利益になると結論付けました私が得ている正確なエラーについて尋ねて、私の問題に対する答えを私に与えないでください。

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
4

2 に答える 2

1

この行により、gold = gold+5Python は、実際に関数を呼び出したときにローカル変数がグローバル変数からgold値をフェッチしないと考えます。goldgoldsell_function()

これは、関数定義が解析されるときに関数内のローカル変数が決定されるために発生します。

グローバル変数を変更する場合は、次のステートメントを使用globalします。

def sell_function():
    global gold
    if inventory[0] in rawfish:
       sold = inventory.pop(0)
       gold = gold+5
于 2013-07-09T19:05:59.680 に答える
1

関数のスコープを確認します。金に新しい値を割り当てているため、python は新しい変数を作成します。次に、5 ずつインクリメントしようとすると、新しい「ゴールド」の値を取得しようとするため、エラーがスローされます。

UnboundLocalError: local variable 'gold' referenced before assignment

それを変更するすべての関数で、「gold」をグローバル変数として宣言します。

global gold
if inventory[0] in rawfish:
于 2013-07-09T19:11:40.750 に答える