2015-04-26 85 views
0

該代碼給出了一個錯誤是分配前參考:如何解決分配前解決變量的異常?

#!/usr/bin/python 
import threading 
import time 
global number 
number = 1 
class myThread(threading.Thread): 
    def __init__(self, threadID): 
     threading.Thread.__init__(self) 
     self.name = threadID 
    def run(self): 
     printFunction(self.name) 
def printFunction(name): 
    while number < 20: 
     number = number +1 
     print number 
     print name 
thread1 = myThread(1) 
thread2 = myThread(2) 
thread1.start() 
thread2.start() 

我怎樣才能解決這個錯誤嗎?

回答

0

這不是關於多線程。您正在訪問和操作全局變量number

您應該將global number語句移動到printFunction,因爲您正在操作函數內的全局變量。

0

正如在這裏提到的其他答案,問題不在於你的線程。這是因爲您正在修改全局變量,但全侷限定符在變量被修改的範圍內出現此片段演示此:

global_variable = 1 

def access(): 
    # we can access a global variable without using the work "global" 
    print("Value of global_variable: {}".format(global_variable)) 
    return 

def qualified_modify(): 
    # we can modify a global variable if we use the "global" qualifier 
    global global_variable 
    global_variable += 1 

    return 

def unqualified_modify(): 
    # we can't modify a global variable without the "global" qualifier 
    # this function will cause an exception to be raised 
    global_variable += 1 
    return 

access() 
qualified_modify() 
print("Incremented global variable: {}".format(global_variable)) 
unqualified_modify() 

這段代碼產生以下輸出:global_variable的

值:1 遞增計數全局變量:2
回溯(最近最後調用):
   文件「global_var.py」,第23行,在
        unq ualified_modify()
   文件 「global_var.py」,第17行,在unqualified_modify
        global_variable + = 1

注意,全球限定符需要出現在函數,其中變量是訪問。它告訴翻譯人員去全球範圍尋找一個變量來修改,但不是僅僅爲了閱讀全局。

由於您沒有包含整個堆棧跟蹤和異常消息,所以我不能確定,但​​我懷疑它指出了number = number + 1這一行。 while number < 20:應該沒問題,因爲解釋器可以找到並且讀取全局變量,但要修改它,您需要告訴解釋器該變量是全局變量。