2013-10-26 3 views
1

Я работаю над текстовым приключением в качестве своего первого проекта python. Я использую шаблон, (копирование кода из учебника youtube). но вместо создания игрового цикла я хочу, чтобы это была функция, которая должна выполняться, когда игрок вводит команду. (эта часть работает). Вот код из учебника:Локальная переменная 'location', на которую ссылаются перед приложением-приложением

Text_Adventure

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] 

Эта часть работает нормально, но когда я пытаюсь включить его в функцию:

Text_Adventure

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() 

I получите сообщение об ошибке:

UnboundLocalError: local variable 'location' referenced before assignment 

Я знаю, что лучший способ узнать что-то - найти ответ самостоятельно. Я искал какое-то время и не получаю нигде, Любая помощь будет принята с благодарностью, спасибо.

+0

Можете ли вы опубликовать полную трассу? – mgilson

+0

Traceback (последний последний звонок): Файл «C: \ Documents and Settings \ Kenneth \ My Documents \ Python_Projects \ projects \ TA.Project \ location \ places_simple.py ", строка 28, в travel() Файл« C: \ Documents and Settings \ Kenneth \ My Documents \ Python_Projects \ projects \ TA.Project \ location \ places_simple.py ", строка 19, в путешествии печать (location [1]) UnboundLocalError: локальная переменная 'location', на которую ссылаются перед присвоением [Закончено в 0,1 с кодом выхода 1] – user2922016

ответ

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 

Что происходит

Когда питон видит a первый раз в функция, это нелокальная переменная (в данном случае глобальная). Второй раз, хотя, поскольку вы назначаете ему, python считает, что это локальная переменная. Но имя уже принято глобальной переменной, что приводит к ошибке.

Есть несколько обходных путей - Вы можете объявить a, как global так, что питон будет знать, что когда вы говорите a = 3, вы имеете в виду, что global переменной a равна 3. Лично хотя, я бы посоветовал вам бить по коде некоторым тем более, что вам больше не нужна глобальная переменная. 99 раз из 100, если вы используете global, вероятно, лучший способ реорганизовать код, чтобы он вам не нужен.

+0

+1 больше объяснено ответ. – Nirock

0

Если вы пишете глобальную переменную, вы должны использовать global, чтобы объявить ее. вместо этого:

def travel(): 

положить это:

def travel(): 
    global location 
0

Спасибо за помощь, я не думаю, Ill держать это так, но он работает сейчас:

#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 

У меня были проблемы, призывающую «а» от другая функция, поэтому я отобразил функцию и результат отдельно. Его работа на данный момент, спасибо

Смежные вопросы