标签:字典 round bsp 包含 常见 决定 函数 丢失 没有
常见的场景 : 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别:
1 使用Python编写的代码 (.py文件)
2 已被编译为共享库或DLL的C或C++扩展
3 包好一组模块的包
4 使用C编程并连接到Python解释器的内置模块
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,
示例文件:自定义模块my_moudule.py,文件名my_module.py,模块名my_module
1 # my_module.py 2 print("form the my_moudle.py") 3 4 money = 1000 5 6 def read1(): 7 print("my_moudle->read1->monet",money) 8 9 def read2(): 10 print("my_moudle->read2 calling read1",) 11 read1() 12 13 def change(): 14 global money 15 money = 0
模块可以包含可执行文件的语句和函数的定义,这些语句的目的是初始化模块,他可以只在模块名第一次遇见打入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块可以import多次,为了防止你重复导入,Python的优化手段是:第一次导入后就将模块加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)如下:
1 # demo.py 2 import my_module # 只在第一次导入时才执行my_module.py 内代码,此处的显式效果是只打印一次‘from the my_module.py‘,当然其他的顶级代码也都被执行了,只不过没有显示效果 3 import my_module 4 import my_module 5 import my_module 6 7 8 9 # 结果 10 form the my_moudle.py
我们可以从sys.modules中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入.
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会被导入时,与使用者的全局变量冲突
1 #测试一:money与my_module.money不冲突 2 #demo.py 3 import my_module 4 money=10 5 print(my_module.money) 6 7 ‘‘‘ 8 执行结果: 9 from the my_module.py 10 1000 11 ‘‘‘
1 #测试二:read1与my_module.read1不冲突 2 #demo.py 3 import my_module 4 def read1(): 5 print(‘========‘) 6 my_module.read1() 7 8 ‘‘‘ 9 执行结果: 10 from the my_module.py 11 my_module->read1->money 1000 12 ‘‘‘
1 #测试二:read1与my_module.read1不冲突 2 #demo.py 3 import my_module 4 def read1(): 5 print(‘========‘) 6 my_module.read1() 7 8 ‘‘‘ 9 执行结果: 10 from the my_module.py 11 my_module->read1->money 1000 12 ‘‘‘
总结:首次导入模块my_modlule是会做三件事:
1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是使用到了global是访问的就是这个名称空间.
2. 在新创建的命名空间中执行模块中包含的代码,见初始导入import my_module
标签:字典 round bsp 包含 常见 决定 函数 丢失 没有
原文地址:https://www.cnblogs.com/heshun/p/9525143.html