评论的“全球代码”是否也可以被执行?

时间:2013-01-18 08:45:38

标签: python

我不知道为什么在评论第七行时输出是不同的。代码如下:

#!/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()

2 个答案:

答案 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的赋值适用于本地范围。