昨天在写python的时候,发现一个诡异的问题,考虑下列代码:
诡异的分割线------------------------------- test1.py
import thread, os, sys, time import test2
var = 0
def foo(a, b): global var while True: if var == 10: print 10 else: print "var not changed", var time.sleep(1)
if __name__ == '__main__': thread.start_new_thread(foo, (1, 0)) test2.test2func() os.system('pause')
匪夷所思的分割线---------------------------------- test2.py
import test1, os, sys, thread
def test2func(): test1.var = 10 print 'call over ', test1.var, '\n'
猥琐的分割线----------------------------------
当启动 foo 线程后,test2func 函数修改 test1.var 的值后,foo 函数对 var 的检查始终是 0,而不是修改后的 10。
问题出在哪里?
做为 python 小鸟,我将问题递交给了 python 老鸟 赖永浩 和 python 中鸟 jgood,赖永浩的解答是:
当相互 import 的时候,__main__ 并没有包含进 test2 内,解决方案是,test2.py 的 import 写成:
import __main__ as test1
这样就解决了这个问题。
jgood 称,这个问题在 py 2.x 版本一直存在。
相互 import 虽然是不好看的代码,但这应该算是 python 的一个 bug 吧。 |