Python中的模块和作用域

模块的定义

模块是写有python源代码的文件(其中定义了一组函数和其他对象)或c、c++编译的对象文件
模块名称就是文件名

模块存在的意义(使用模块的好处)

可通过使用模块避免名称冲突(两个模块中可定义相同名称的函数)
模块使python代码更易于管理(标准python函数位于特殊模块而非语言核心中,因此用户可根据需要加载目标模块)

添加自己的模块

将自己的模块添加到sys中使之可以通过使用import导入(import会在sys.path(搜索模块的路径集)中查询名为目标名称的模块,导入找到的第一个满足要求的模块)

import sys
sys.path.append('自己的模块所在的路径')
import 自己的模块名(模块所属的文件名)

访问模块中的变量或函数,需要在其名称前添加"模块名."

  • 如果想直接使用变量或函数,可以使用该形式将其导入:from 模块名 import 变量或函数名1, 变量或函数名2, 变量或函数名3

对于模块中名称以下划线开头的对象,如果以from 模块名 import * 的形式导入模块,则无法访问该模块中名称以下划线开头的对象

  • 但是可以通过import 模块名 导入模块后,通过 模块名.以下划线开头的对象名 的方式来调用该对象

命名空间

定义:一个字典,key是变量名,value是变量的值

  • 每个函数拥有自己的命名空间(局部命名空间):记录该函数的变量、参数、局部变量(如果想在局部命名空间中声明全局变量,需在变量名前添加global)
  • 每个模块拥有自己的命名空间(全局命名空间):记录该模块的变量(函数、类,导入的模块、常量)
  • 内置命名空间:任何模块可访问,存放内置函数和异常

查找顺序

  • 当某行代码使用变量x的值时,python按如下顺序在各名称空间中查找变量(找不到则在下一级命名空间中继续找):
    局部(若是嵌套函数,则现在当前函数命名空间中找,找不到再在父函数的命名空间中找) -> 全局 -> 内置 -> 抛出NameError异常

生命周期

  • 内置命名空间:在python解释器启动时创建,一直保留不删除
  • 模块的全局命名空间:读入模块定义时创建,保存到解释器退出
  • 函数的局部命名空间:函数调用时创建,函数返回或抛出异常时删除(每个递归调用的函数拥有自己的命名空间)

访问

  • 通过 locals() 获得局部命名空间,通过 globals() 获得全局命名空间
  • locals()返回的是局部命名空间的拷贝,因此修改它不会影响局部变量的值
  • globals()返回实际的全局命名空间,因此修改它会影响全局变量的值

引申
from 模块名 import 对象名 和 import 模块名 的区别

  • import 模块名:导入模块,其保持自己的命名空间,因此使用其内的对象时,需要在前面添加模块名
  • from 模块名 import 对象名:将目标模块中指定的对象导入本模块(将对象放入本模块的命名空间)。因此可以直接访问导入的对象(使用globals()可看到导入对象)

你可能感兴趣的:(Python中的模块和作用域)