在函数中:
a += 1
将被编译器解释为assign to a => Create local variable a
,这不是您想要的。a not initialized
由于(local)a确实尚未初始化,因此可能会失败并显示错误:
>>> a = 1
>>> def f():
... a += 1
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
您可以使用global
关键字(由于种种原因而非常皱眉)来获得所需的内容,如下所示:
>>> def f():
... global a
... a += 1
...
>>> a
1
>>> f()
>>> a
2
但是,一般而言,应避免使用变得异常失控的全局变量。对于多线程程序尤其如此,在多线程程序中,您没有任何同步机制可让您thread1
知道何时a
进行了修改。简而言之:线程很复杂,并且当两个(或更多)线程以相同的值工作时,您不能期望对事件发生的顺序有直观的了解。语言,编译器,OS,处理器...都可以发挥作用,并出于速度,实用性或任何其他原因决定更改操作顺序。
这种事情的正确方法是使用Python共享工具(锁
和朋友),或者更好的方法是通过Queue而不是共享数据来传递数据,例如:
from threading import Thread
from queue import Queue
import time
def thread1(threadname, q):
while True:
a = q.get()
if a is None: return
print a
def thread2(threadname, q):
a = 0
for _ in xrange(10):
a += 1
q.put(a)
time.sleep(1)
q.put(None)
queue = Queue()
thread1 = Thread( target=thread1, args=("Thread-1", queue) )
thread2 = Thread( target=thread2, args=("Thread-2", queue) )
thread1.start()
thread2.start()
thread1.join()
thread2.join()