if __name__ == '__main__'解析

相信大家在看别人的python程序时,可能会在大部分的程序后看到标题这段代码,这里解释下它的意义。总的来说,这句代码的作用就是既能保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入。

下面我将通过几个例子帮助大家理解
1.py

print(__name__)

我们在1.py中只写了这么一段代码,输出结果为下面代码

__main__

这说明__name__本身其实就是一个变量,不过比较特殊。实际上,它是在程序执行前就被创建并赋值的,而赋值的机制是这里的关键。在当前程序被当作主程序运行时, __ name__被自动赋值为固定的字符串__main__;当它被当作模块被其他文件调用时,自动被赋值为模块所在的文件名。
2.py

def printhello():
    print("Hello World")
    print(__name__)

if __name__ == '__main__':
    printhello()

输出:
在这里插入图片描述

其实我们可以发现,下面p_l.py中即使不要2.py中的判断语句也照样可以运行,且输出与带有判断的一样:

def printhello():
    print("Hello World")
    print(__name__)

printhello()

可见这句判断代码的作用就是既能保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入。所以它也可以在当前文件被当作一个模块导入时发挥关键作用。

但当其不要判断语句且它被作为模块导入时,输出的结果可能就与大家想的有点偏差了。
4.py

from p_l import printhello
printhello()

输出结果:

Hello World
p_l
Hello World
p_l

首先,可以看到p_l.py在被作为模块调入时,对应的__name__被赋值为对应的文件名,虽然只运行了一遍4.py文件,但我们可以发现函数执行了两次,这是因为,不带判断语句的p_l.py文件作为模块被引入时,printhello函数已经自动执行了一次,之后在4.py被主动调用时执行了一次,所以一共执行两次。
那么,此代码的作用已经十分清楚了,它保证模块文件的函数既能在模块文件单独执行,又能保证它被其它.py文件导入时,相应的函数不会执行两次。

所以:
p_l.py

扫描二维码关注公众号,回复: 4441730 查看本文章
 def printhello():
        print("Hello World")
        print(__name__)
    
    if __name__ == '__main__':
        printhello()

输出:

Hello World
__main__

4.py:

from p_l import printhello
printhello()

输出:

Hello World
p_l

这样就能使p_l.py和4.py都能正常使用printhello函数。

猜你喜欢

转载自blog.csdn.net/forever_wen/article/details/84787021