関数内:
a += 1
コンパイラによって として解釈されますがassign to a => Create local variable a
、これはあなたが望むものではありません。a not initialized
(ローカル) 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
。つまり、スレッドは複雑であり、2 つ (またはそれ以上) のスレッドが同じ値で動作する場合、イベントが発生する順序を直感的に理解することは期待できません。言語、コンパイラ、OS、プロセッサ...すべてが役割を果たすことができ、速度、実用性、またはその他の理由で操作の順序を変更することを決定できます。
この種のことの適切な方法は、Python 共有ツール (ロックとフレンド) を使用することです。または、共有する代わりにQueue
を介してデータを通信することをお勧めします。たとえば、次のようにします。
from threading import Thread
from queue import Queue
import time
def thread1(threadname, q):
#read variable "a" modify by thread 2
while True:
a = q.get()
if a is None: return # Poison pill
print a
def thread2(threadname, q):
a = 0
for _ in xrange(10):
a += 1
q.put(a)
time.sleep(1)
q.put(None) # Poison pill
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()