朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow
声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!
前面的文章谈到了导入模块,但是并没有实际解释当你导入模块时都发生了什么。
有些C程序设计者喜欢把Python的模块导入操作比作C语言中的#include,但其实不应该这么比较:在Python中,导入并非只是把一个文件文本插入另一个文件而已。导入其实是运行时的运算,程序第一次导入指定文件时,会执行三个步骤。
1.找到模块文件。
2.编译成位码(需要时)。
3.执行模块的代码来创建其所定义的对象。
记住,这三个步骤只在程序执行时,模块第一次导入时才会进行。在这之后,导入相同模块时,会跳过这三个步骤,而只提取内存中已加载的模块对象。从技术上讲,Python把载入的模块存储到一个名为sys.modules的表中,并在一次导入操作的开始时检查该表。如果模块不存在,将会启动这三个步骤。
1.搜索
首先,Python必须查找到import语句所引用的模块文件。注意:import语句不需要指定文件后缀,也不需要指定目录路径,只是简单的import b,而不是import c:\ dir1\b.py。路径和后缀是刻意省略掉的,因为Python会使用标准模块搜索路径搜索import语句所对应的模块文件。
2.编译(可选)
遍历模块搜索路径,找到符合import语句的源代码文件后,如果必要的话,Python接下来会将其编译成字节码。
Python会检查文件的时间戳,如果发现字节码文件比源代码文件旧(例如,如果你修改过源文件),就会在程序运行时自动重新生成字节代码。另一方面,如果发现.pyc字节码文件不比对应的.py源代码文件旧,就会跳过编译步骤。此外,如果Python在搜索路径上只发现了字节码文件,而没有源代码,就会直接加载字节码(这意味着你可以把一个程序只作为字节码文件发布,而避免发送源代码)。
注意:只有当文件导入时,才会进行编译。因此,通常不会看见程序顶层文件的.pyc字节码文件,除非这个文件也被其他文件导入:只有被导入的文件才会在机器上留下.pyc。顶层文件通常是设计成直接执行,而不是被导入的。
3.运行
import操作的最后步骤是执行模块的字节码。文件中所有语句会依次执行,从头至尾。例如,文件中的d e f语句会在导入时执行,来创建函数。之后,函数就能被程序中这个文件的导入者来调用。
因为最后的导入步骤实际上是执行文件的程序代码,如果模块文件中任何顶层代码确实做了什么实际的工作,你就会在导入时看见其结果。例如,当一个模块导入时,该模块内顶层的print语句就会显示其输出。
正如你所见到的那样,import操作包括了三个操作:搜索文件、或许会进行编译操作以及执行Python代码。任何给定的模块在默认情况下每个进程中只会导入一次。未来的导入会跳过导入的这三个步骤,而是重用已加载内存内的模块。如果你在模块已加载后还需要再次导入(例如,为了支持终端用户的定制),你就得通过调用reload强制再导入。
点赞,收藏,谢谢!