एक समारोह में:
a += 1
संकलक द्वारा व्याख्या की जाएगी assign to a => Create local variable a
, जैसा कि आप जो चाहते हैं वह नहीं है। यह संभवतः एक a not initialized
त्रुटि के साथ विफल हो जाएगा क्योंकि (स्थानीय) वास्तव में प्रारंभ नहीं किया गया है:
>>> 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, प्रोसेसर ... सभी एक भूमिका निभा सकते हैं, और गति, व्यावहारिकता या किसी अन्य कारण से संचालन के क्रम को संशोधित करने का निर्णय ले सकते हैं।
इस तरह की चीज़ों के लिए उचित तरीका है पायथन शेयरिंग टूल्स ( ताले
और दोस्त) का उपयोग करना, या बेहतर, इसे साझा करने के बजाय क्यू के माध्यम से डेटा का संचार करना, जैसे कि:
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()