2016-09-27 189 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