如何在分配之前解决正在解析的变量的异常?

时间:2015-04-26 19:21:05

标签: python multithreading python-3.x

此代码在分配前提供数字引用的错误:

#!/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()

如何解决错误?

2 个答案:

答案 0 :(得分:0)

这不是关于多线程的。

printFunction中,您正在访问和操作全局变量number

您应该将global number语句移到printFunction,因为您正在操作函数内的全局变量。

答案 1 :(得分: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行,中   unqualified_modify()
  文件“global_var.py”,第17行,在unqualified_modify中   global_variable + = 1

请注意,全局限定符需要出现在访问变量的函数中。它告诉解释器在全局范围中查找要修改的变量,但不一定只是为了读取全局。

由于您没有包含整个堆栈跟踪和异常消息,我无法确定,但我怀疑它指出了number = number + 1行。 while number < 20:应该没问题,因为解释器可以找到并读取全局变量,但要修改它,你需要告诉解释器变量是全局的。