2016-09-27 190 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分配新建分配FY

+1

使用'position'变量 –

+0

对于之前给'内部功能的全球position'更多理解见http://www.python-course.eu/python3_global_vs_local_variables.php –

+0

请给你的变量赋有意义的名字。 –

回答

3

问题的行实际上是position = s_final在功能build_message

如果它不存在,那么message = position可以工作,因为Python解释器会知道你指的是哪个position变量。

但在这种情况下,它是含糊不清的,因为你后来重新分配到positionposition = s_final)。

您应该重新考虑代码的设计,或者添加global position作为build_message中的第一行。请记住,正如它所说的那样,它会使position成为一个全局变量,并且build_message将在整个代码中的每个位置更改值position

编辑一个快速演示:

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'不能告诉你是否试图创建一个新的本地'位置'变量,或者你想分配给全局'位置'变量。 – DeepSpace

+0

所以如果我们不使用'global',那么在这个语句'message = position'中'position'的值是否为零? –

1

您需要使用global关键字来访问全局变量。

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

如果使用外部变量到一个函数,也许你应该考虑把它当作一个参数,如:

def build_message(signal,position): 
    pass