面试题答案
一键面试if __name__ == '__main__':
块内代码不执行原因:- 在Python中,每个模块都有一个内置变量
__name__
。当一个Python文件作为主程序直接运行时,__name__
被设置为'__main__'
。 - 但当该文件被其他模块导入时,
__name__
被设置为模块的名称(通常是文件名去掉.py
后缀)。所以if __name__ == '__main__':
条件判断不成立,块内代码不会执行。
- 在Python中,每个模块都有一个内置变量
- 与模块导入系统和作用域规则配合:
- 模块导入系统:当导入一个模块时,Python解释器会按顺序查找模块。导入过程中会执行模块顶层的代码,但遇到
if __name__ == '__main__':
块时,由于__name__
此时不是'__main__'
,块内代码跳过。 - 作用域规则:模块内定义的变量和函数有其自身的作用域。在
if __name__ == '__main__':
块内定义的函数,其作用域在该块内。当模块被导入时,该块内定义的函数在模块的正常作用域中不可见,因为该块未执行。
- 模块导入系统:当导入一个模块时,Python解释器会按顺序查找模块。导入过程中会执行模块顶层的代码,但遇到
- 关于块内定义函数的调用:
- 不能直接调用:在外部模块导入时,不能直接调用
if __name__ == '__main__':
块内定义的函数。原因是当模块被导入时,该块内代码未执行,函数没有被定义到模块的正常作用域中。 - 实现调用方法:可以将该函数定义移到
if __name__ == '__main__':
块外部,使其在模块被导入时就被定义到模块的正常作用域中。例如:
- 不能直接调用:在外部模块导入时,不能直接调用
def my_function():
print('This is my function')
if __name__ == '__main__':
my_function()
这样在其他模块导入该模块后,就可以通过模块名.my_function()
调用该函数。