Python 3.x 为什么Python模块只执行函数/类代码之外的第一次代码

Python 3.x 为什么Python模块只执行函数/类代码之外的第一次代码,python-3.x,import,module,Python 3.x,Import,Module,文件words.py def print_word(): print("Hello Words") print(__name__) 当我从控制台运行上述代码时: (base) C:\Users\Desktop\Python>python words.py __main__ (base) C:\Users\Desktop\Python>python words.py __main__ (base) C:\Users\Desktop\Python>python w

文件words.py

def print_word():
    print("Hello Words")

print(__name__) 
当我从控制台运行上述代码时:

(base) C:\Users\Desktop\Python>python words.py
__main__

(base) C:\Users\Desktop\Python>python words.py
__main__

(base) C:\Users\Desktop\Python>python words.py
__main__

(base) C:\Users\Desktop\Python>python
Python 3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from words import *
words
>>> from words import *
>>>

为什么在导入过程中它只执行一次print,但在运行python words.py时它执行print的次数与我们执行的次数相同?

导入模块时,python会创建该模块的模块实例

在第一次导入之后,解释器已经有了该模块的一个实例,因此它不执行任何操作

Python的导入文档:

当第一次导入模块时,Python搜索该模块,如果找到该模块,它将创建一个模块对象,并对其进行初始化

您可以阅读有关模块加载过程的更多信息:

  • 如果sys.modules中存在具有给定名称的现有模块对象,则导入将已返回该对象

  • 在加载程序执行模块代码之前,模块将存在于sys.modules中。这是至关重要的,因为模块代码可能(直接或间接)导入自身;预先将其添加到sys.modules中可以防止在最坏的情况下出现无界递归,在最好的情况下防止多次加载