标签:是什么 全局变量 变量 方式 顺序 好的 两种 global 解释器
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)
1)为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间
2)在新创建的命名空间中执行模块中包含的代码
3)创建名字spam来引用该命名空间
这个名字和变量名没什么区别,都是‘第一类的’,且使用spam.名字的方式可以访问spam.py文件中定义的名字。
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量在被导入时,与使用者的全局变量冲突
import sapm as f print(f.x)
import time,sys,re
from django import *
大部分情况下不要用导入*的方式,因为不知道导入的是什么名字,很有可能会覆盖掉之前已经定义的名字,而且可读性极其的差。
from import和import的对比
唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了,无需加前缀:spam
解决方案一:把循环导入的语句放到最后。有循环导入的问题,本质上就是导入时,这个变量还没被定义,所以,先让所有变量定义好,然后再导入。
解决方案二:将循环导入语句放到函数内。这是因为函数在定义时只检测语法,不执行函数体。
1)当文件是被执行文件时
if __name__ == ‘__main__‘:
然后执行下面的代码
2)当文件是被导入文件时
if __name__ == ‘__main__‘:
不会执行该行下面的代码
模块的查找顺序是:内存中已经加载的模块——》内置模块——》sys.path路径中包含的模块
在第一次导入某个模块(比如spam),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用,如果没有,解释器则会查找同名的内建模块。如果还没有找到就从sys.path给出的目录列表中依次寻找spam.py文件。
其中sys.path中第一个值是当前执行文件所在的文件夹。
强调:所有被导入的模块参照环境变量sys.path都是以执行文件为准的
应用:执行文件与被导入的模块中都可以使用
缺点:所有导入都是以sys.path为起始点,导入麻烦
把被导入模块的文件夹加入sys.path中
import sys sys.path.append(r‘D:\SH fullstack_3qi\上课\week01\day01\test‘) from dir1 import m1 m1.f1()
符号:.代表当前所在文件的文件夹,..代表上一级文件夹 ...代表上一级的上一级文件夹
缺点:只能在被导入的模块中使用,不能在执行文件中用
优点:导入更加简单
标签:是什么 全局变量 变量 方式 顺序 好的 两种 global 解释器
原文地址:https://www.cnblogs.com/xufengnian/p/9965428.html