main函数在import语句中的特殊行为

先说结论, 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函数为什么这么特殊

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值