我不知道为什么在评论第七行时输出是不同的。代码如下:
#!/usr/bin/python
import threading
import time
def loop(thread_name):
if False:
print "1111" #The print is only used to prove this code block indeed not excute
global dict_test # The output will be different when commenting this line code
else:
dict_test = {}
i = 0
while i < 10:
i+=1
print "thread %s %s" % (thread_name,id(dict_test))
time.sleep(1)
t1=threading.Thread(target=loop,args=('1'))
t2=threading.Thread(target=loop,args=('2'))
t1.start()
t2.start()
t1.join()
t2.join()
如果解释是全局变量是预编译的,无论哪个条件匹配,为什么以下代码会报告错误?
#!/usr/bin/python
import threading
import time
def loop(thread_name):
if False:
print "1111" #The print is only used to prove this code block indeed not excute
global dict_test # The output will be different when commenting or uncommenting this line code
else:
# dict_test = {}
pass
i = 0
while i < 10:
i+=1
print "thread %s %s" % (thread_name,id(dict_test))
time.sleep(1)
t1=threading.Thread(target=loop,args=('1'))
t2=threading.Thread(target=loop,args=('2'))
t1.start()
t2.start()
t1.join()
t2.join()
答案 0 :(得分:4)
要解析变量Python搜索的名称:
本地范围
任何封闭函数的范围
全球范围
内置插件
(source)
此处未提及 if
和其他流控制结构。因此,if
内的范围与外部相同,因此无论是否正在执行此块,现有变量dict_test
都是全局的。
这可能会令人惊讶,但这就是它的定义方式。
我的输出是
thread 1 50663904
thread 2 50667360
thread 1 50667360
thread 2 50667360
thread 1 50667360
thread 2 50667360
...
所以最初,当两个线程同时启动时,两个变量是独立的。从第二次迭代开始,它们都引用相同的全局变量。
答案 1 :(得分:0)
无论是否执行if语句,都应用全局语句。因此,在评论全局语句时,dict_test的赋值适用于本地范围。