变量作用域不一样?

变量作用域不一样?

下面的代码counter需要global,time_to_go和counter_lock却不需要,why?

[Copy to clipboard] [ - ]
CODE:
from threading import Thread,Lock,Event

counter=0
counter_lock=Lock()

class Worker(Thread):
        def __init__(self,id,count):
                Thread.__init__(self)
                self.id=id
                self.count=count
               
        def run(self):
                global counter
                from time import sleep
                time_to_go.wait()
                for i in range(self.count):
                        counter_lock.acquire()
                        counter+=1
                        localcopy=counter
                        counter_lock.release()
                        print "id %s gets %d" % (self.id,localcopy)
                        sleep(.001)

nthreads=4
time_to_go=Event()
for i in range(nthreads):
        w=Worker(chr(ord('A')+i),3)
        w.start()
time_to_go.set()

因为对于counter有一个赋值操作,counter+=1,而赋值操作就是在当前作用域创建一个变量。除非你使用global来声明。而使用time_to_wait时没有赋值,是引用对象,如果当前作用域没有定义(即没有赋值)则使用全局变量。自然不会有问题。