2015-09-19 1 views
0

У меня есть вопрос, который является проблемой.Почему моя переменная «указана перед назначением», но не тогда, когда я изменяю слово, которому оно присвоено?

Я делаю программу крафтинга, чтобы узнать python больше, но столкнулся с проблемой; Я назначаю свои переменные в начале и позже их пользователям, как вы предполагали, однако в нем появилось сообщение об ошибке «UnboundLocalError: локальная переменная» vSaplings, на которую ссылаются перед назначением ». Я пробовал много разных способов написания его, но в конце концов, все, что я должен был сделать изменить

vSaplings 

в

v_Saplings 

Теперь нет никакой ошибки. Зачем это нужно сделать? Это просто персонаж.

код в вопросе:

vSaplings = 20 
... 
elif reqO == "Twigs": 
     print("This requires at least 1 sapling.") 
     if vSaplings > 0: 
      amountSaplings = input("How many saplings would you like to use to craft twigs? 1 sapling = 3 twigs.") 

Это получает ошибку. Изменение «vSaplings» на «v_Saplings» удаляет ошибку. Зачем?

спасибо.

EDIT: Теперь я понимаю, что на самом деле это должна быть глобальная переменная. Еще один вопрос, нужно ли мне делать переменные глобальными в каждой отдельной функции, которую я создаю? Похоже, это заняло бы много места.

+2

'vSaplings' и' v_Saplings' являются две различные переменные, я думаю, что нам нужно больше контекста вы говорите, что вы изменили * и * экземпляры этого имени или только один или другой? –

+0

Извините. Да, я изменил оба варианта, и это сработало. – Jonathan

+0

'UnboundLocalError: локальная переменная 'v Саплинги ссылаются перед присваиванием' -> У вас есть v_Saplings где-нибудь еще в этом файле? – NightShadeQueen

ответ

0

Вы сделали что-то вроде этого:

#This will NOT work 
foo = 20 

def f(): 
    if foo > 10: 
     print 'hello' 
    foo = foo + 1 

Это вызовет Unbound локальную ошибку.

Чтобы обойти это, вы можете сделать одну из двух вещей. Самое простое что-то вроде этого:

#This is OK 
foo = 20 

def f(): 
    global foo 
    if foo > 10: 
     print 'hello' 
    foo = foo + 1 

Однако, как правило, вы должны работать в avoid global variables. Для этого существует множество причин, большинство из которых сводятся к тому, что «это делает код более сложным для понимания и поддержки. Легче рассуждать о автономных функциях, и поэтому вы можете подумать о том, чтобы сделать что-то еще вот так:

#Better (in the opinion of this poster) 

def f(foo): 
    if foo > 10: 
     print 'hello' 
    return foo + 1 

которые затем могут быть вызваны из любой, как это:..

foo = f(foo)