1

私は最初の python プロジェクトとしてテキスト アドベンチャーに取り組んでいます。テンプレートを使用しています (YouTube チュートリアルのコードをコピーします)。しかし、ゲームループを作成する代わりに、プレーヤーがコマンドを入力したときに実行される関数にしたいと考えています。(その部分は機能しています)。チュートリアルのコードは次のとおりです。

テキスト_アドベンチャー

bridge = ("Bridge", "You are on the bridge of a spaceship, sitting in the captains chair. ")

readyRoom = ("Ready Room" , "The captains ready room ")

lift = ("Lift" , "A turbolift that takes you throughout the ship. ")

transitions = {
    bridge: (readyRoom, lift),
    readyRoom: (bridge,),
    lift: (bridge,)
    }
 
 

location = bridge


while True:

    print (location[1])
    print ("You can go to these places: ")

    for (i, t) in enumerate(transitions[location]):
        print (i + 1, t[0])
    
    choice = int(input('Choose one: '))
    location = transitions[location][choice - 1]

その部分は問題なく動作しますが、関数に変換しようとすると:

テキスト_アドベンチャー

bridge = ("Bridge", "You are on the bridge of a spaceship, sitting in the captains chair. ")

readyRoom = ("Ready Room" , "The captains ready room ")

lift = ("Lift" , "A turbolift that takes you throughout the ship. ")

transitions = {
    bridge: (readyRoom, lift),
    readyRoom: (bridge,),
    lift: (bridge,)
    }
 
 

location = bridge


def travel():

    print (location[1])
    print ("You can go to these places: ")

    for (i, t) in enumerate(transitions[location]):
        print (i + 1, t[0])
    
    choice = int(input('Choose one: '))
    location = transitions[location][choice - 1]

travel()

エラーメッセージが表示されます:

UnboundLocalError: local variable 'location' referenced before assignment

何かを学ぶ最善の方法は、自分で答えを見つけることだということを私は知っています。私はしばらくの間探していましたが、どこにも行きません.どんな助けでも大歓迎です,ありがとう.

4

3 に答える 3

1

これはかなり単純化できます。

>>> a = 1
>>> def foo():
...    print a
...    a = 3
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'a' referenced before assignment

何が起こっていますか

Python がa関数内で初めて見たとき、それは非ローカル変数 (この場合はグローバル) です。ただし、2回目は割り当てているため、pythonはそれがローカル変数であると認識していますが、名前はグローバル変数によって既に取得されており、エラーが発生しています。

いくつかの回避策があります - aasを宣言するglobalことで、 と言うときにa = 3変数globala3 であることを python が認識できるようになります。変数。100 回中 99 回、 を使用している場合はglobal、コードをリファクタリングするためのより良い方法がおそらくあるので、それは必要ありません。

于 2013-10-26T02:37:44.907 に答える
0

助けてくれてありがとう、私はそれをこのように保つとは思わないが、今のところうまくいく:

#Simplefied version:
a = 1
def foo():
    global a
    a = 3
    print a 
def getFoo():
    print a
print "foo results: "
foo()
print "getFoo results: "
getFoo()

版画:

foo results: 
3
getFoo results: 
3

別の関数から「a」を呼び出すのに問題があったため、関数と結果を別々に表示しました。今のところ動作しています、ありがとう

于 2013-10-28T23:20:31.197 に答える