2016-09-27 3 views
0

У меня проблема при ссылке на переменные в файле python. Вот код:Python Как ссылаться на переменную

FG_E = 9 
FG_R = 8 
START = 7 
READY = 9 
MC = 3 
BRAKE = 5 
ERROR = 6 
a = 2 
b = 3 

position = 0 

def build_message(signal): 
    message = position 
    message = message | (0b1<<signal) 
    s = bin(message) 
    s = s[2:len(s)] 
    s = (16-len(s))*'0' + s 

    s0 = s[0:len(s)/2] 
    s1 = s[len(s)/2:len(s)] 
    s0 = s0[::-1] 
    s1 = s1[::-1] 
    s_final = int(s0 + s1, 2) 
    position = s_final 
    print bin(s_final) 
    return s_final 

build_message(FG_R) 

Ошибки я получаю: UnboundLocalError: локальная переменная «позиция» ссылка berofe распайка

+1

дать 'глобальный position' внутри функции перед использованием' position' переменной –

+0

для больше понимания см. http://www.python-course.eu/python3_global_vs_local_variables.php –

+0

Просьба указать ваши переменные значащие имена. –

ответ

3

Проблематика линия на самом деле position = s_final в функции build_message.

Если бы его там не было, тогда message = position работал бы, потому что интерпретатор Python знал бы, к какой переменной относится вы: position.

Но в этом случае это неоднозначно, потому что вы позже переназначаетесь до position (position = s_final).

Вы должны либо подумать о дизайне кода, либо добавить global position в качестве первой строки в build_message. Имейте в виду, что, как он говорит, это сделает position глобальной переменной, и build_message изменит значение position каждый раз, когда на вашем коде.

EDIT Быстрый демо:

global_var = 0 

def foo1(): 
    print(global_var) 

def foo2(): 
    print(global_var) 
    global_var = 1 

def foo3(): 
    global global_var 
    print(global_var) 
    global_var = 1 
    print(global_var) 

foo1() 
>> 0 

foo2() 
>> UnboundLocalError: local variable 'global_var' referenced before assignment 

foo3() 
>> 0 
    1 
+0

Почему Python ведет себя так? означает 'message = position', он работал бы, мы не можем присваивать что-либо' position', пока он не будет объявлен глобальным. –

+0

@KalpeshDusane Потому что это создает двусмысленность. Если 'position' является' global', 'position = s_final' не может определить, пытаетесь ли вы создать новую локальную переменную' position' или если вы хотите назначить глобальную переменную 'position'. – DeepSpace

+0

Итак, если мы не используем 'global', тогда значение' position' в этом выражении 'message = position' равно нулю или нет? –

1

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

def build_message(signal): 
    global position 
    message = position 
0

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

def build_message(signal,position): 
    pass 
Смежные вопросы