此代码在分配前提供数字引用的错误:
#!/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 :(得分: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:
应该没问题,因为解释器可以找到并读取全局变量,但要修改它,你需要告诉解释器变量是全局的。