先说结论, import module时会执行module函数级别代码, 但是如果该module中有main函数, 并不会执行.
听起来比较复杂, 看下下面的代码就懂了, 也有一部分问题没有解决, 希望大佬来教学下
test_02.py
from test_03 import test_print
x = None
print 'test_02 execute'
def get_x():
global x
print 'get_X'
return x
def set_x():
global x
print 'set_x'
x = 10
if __name__ == '__main__':
print 'execute main'
set_x()
print get_x()
print '===================================='
test_print()
test_03.py
def test_print():
import test_02 as x
print x.x
上面test_02
执行, 调用了test_03
中的 test_print()
, test_print
去打印test_02
中的全局变量x
, 却发现还是默认值,这是为什么呢?
看下打印结果
原来是test_03中执行import语句的时候, 执行了test_02中函数级别的语句, 并且如果我们给代码再改一改, 加上id, 看一下:
test_02
if __name__ == '__main__':
print 'execute main'
set_x()
print get_x()
print '===================================='
test_print()
print get_x()
print id(x)
test_03
def test_print():
from test_02 import x
print x
print id(x)
执行结果
我们发现id都不一样
也就是说test_03中import x的时候不仅执行了一遍test_02中的代码, 甚至都不是同一个对象了
但是如果我们把set_x()从main函数中提出到外面, 再看一遍结果
id又一样了, 这是为什么呢? 有没有大佬来解释一下main函数为什么这么特殊