2012-01-23 3 views
0
gCharlie = 0 
gJeff = 0 

def Bob(): 
    Charlie = gCharlie 
    Jeff = gJeff 
    Number = int(input("Hello and Welcome to Charlie's Number Guessing Game. Enter a nonnegative number from 0 to 10 not counting 0. ")) 

Этот код дает мне эту ошибку в Python 3.2:Python 3.2.2 Ошибка Локальная переменная

UnboundLocalError: local variable 'gCharlie' referenced before assignment 

Что это значит локальная переменная ошибка?

+4

Я сам запустил этот код и не получил таких ошибок. Может быть, код, вызывающий эту функцию? Это отдельный файл? Как вы импортируете его, если так? и т. д. –

+3

Я пробовал это в двух разных версиях Python, и он работал отлично. – senderle

ответ

3

В рамках вашей функции вы должны были переназначить gJeff и gCharlie, которые создали их как новые локальные переменные. Чтобы сообщить python, что вы используете глобальные переменные, измените верхнюю часть своей функции так, чтобы она выглядела.

def Bob(): 
    global gCharlie 
    global gJeff 
    Charlie=gCharlie 

, не говоря питон, который вы используете глобал, он пытается ссылаться на локальный gCharlie и переменный gJeff, которые, как он говорит, не были назначены в этот момент в вашей функции. Причина, по которой люди работают, заключается в том, что они используют только код, который вы опубликовали. Вы можете ссылаться на глобальные переменные без явного упоминания этого ТОЛЬКО, если вы не изменяете свои значения в функции, ссылающейся на них.

Как правило, python выполняет поиск в этом порядке для имени переменной: local scope, любой def вложен внутри внутри, global, built ins. Bbecause gJeff и gCharlie являются локальными переменными в вашей функции, они останавливаются там, если вы не скажете об этом иначе.

Если вы хотите увидеть это в действии, попробуйте посмотреть на это

x=5 

def useX(): 
    x=0  #this is a local variable 
    print "in function: ", x 

def main(): 
    print "in main(1): ", x 
    useX() 
    print "in main(2): ", x 

main() 

это будет выводить

in main(1): 5 
in function: 0 
in main(2): 5 

, потому что в функции х создается как новой локальной переменной. Добавление глобальной инструкции x в функцию useX приведет к изменению последней строки для печати «0» вместо «5»

+1

* «он не распознает глобальные значения по умолчанию». * Вводит в заблуждение, например, каждое имя модуля, которое вы вводите через 'import some_module' на уровне модуля, является обычным глобальным, которое вы, очевидно, можете * использовать внутри любой функции. Вам не нужно «глобальное», если вы не изменяете свои привязки внутри функции, [пример] (http://ideone.com/J2s6K). Если вам это нужно, вы должны, вероятно, реорганизовать функцию в метод и глобальный в атрибут экземпляра. – jfs

+0

Еще более очевидным примером являются имена функций. Вам не нужно «global useX» для вызова 'useX()' inside 'main()'. – jfs

+0

Этот ответ неверен. –

2

Возможно, из-за этого есть gCharlie = внутри функции (примечание: первая буква g).

Используйте параметры вместо глобалов:

def bob(charlie=0, jeff=0): 
    number = int(input("...")) 
    # ... 

bob(charlie=3) 
2

Это означает, что вы присваивание gCharlie в части функции вы не показали, и поэтому компилятор Python пометил его как локальную переменную , Таким образом, вы получаете доступ к нему до его существования. Используйте nonlocal или global.

1

Два предыдущих ответа здесь верны, но оба они немного неясны. Я покажу некоторые примеры:

код вы показываете будет работать нормально:

>>> gCharlie = "Global!" 
>>> 
>>> def foo(): 
...  print(gCharlie) 
... 
>>> foo() 
Global! 
>>> print(gCharlie) 
Global! 

Так что это не проблема вообще. Тем не менее, вы не можете назначить глобальные переменные внутри функции:

>>> gCharlie = "Global!" 
>>> def foo(): 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Local! 
>>> print(gCharlie) 
Global! 

Как вы видите, глобальная переменная gCharlie не изменилась. Это связано с тем, что вы не изменили его, вы создали новую локальную переменную с тем же именем. И это является причиной ошибки:

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

Приведенные данные погрешности.В нем указывается местный переменная gCharlie. Проблема заключается не в невозможности доступа к глобальному gCharlie, а в том, что локальный пока не создан.

Исправление состоит в том, чтобы указать, что вы не хотите создавать локальную переменную, но хотите изменить глобальную. Вы делаете это с помощью глобального ключевого слова.

>>> gCharlie = "Global!" 
>>> def foo(): 
...  global gCharlie 
...  oldCharlie = gCharlie 
...  gCharlie = "Local!" 
...  print(gCharlie) 
... 
>>> foo() 
Local! 
>>> print(gCharlie) 
Local! 

Как вы видите сейчас, вы изменили глобальную переменную.

Таким образом, глобальные переменные обычно являются плохими идеями. Избежать их. Попытайтесь передать переменные в качестве параметров.

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