模块是单个.py文件,包是含__init__.py的目录;模块直接加载代码,包先执行__init__.py再按需加载子模块;包支持相对导入和层级结构,模块不支持。

Python 中模块和包是组织代码的两个基础单位,面试常考它们的定义、结构、使用方式和关键区别。核心一句话:模块是一个 .py 文件,包是一个含 __init__.py 的目录。
模块是什么?怎么用?
模块就是一个以 .py 为后缀的文件,比如 utils.py 或 math.py。它里面可以写函数、类、变量,甚至可执行语句(但通常只在 if __name__ == "__main__": 下运行)。
- 导入方式有多种:
import math、from utils import helper、import numpy as np - 模块名就是文件名(不含
.py),命名要符合标识符规则(不能数字开头、不能含特殊符号) - 每个模块有独立命名空间,不同模块里叫
load()的函数不会互相干扰
包是什么?为什么需要它?
包是模块的容器,本质是一个带 __init__.py 文件的文件夹。这个文件可以为空,也可以写初始化逻辑(比如自动导入子模块)。没有它,Python 就不认为那个文件夹是包。
- 包支持层级结构,例如
myproject/db/mysql.py和myproject/db/postgres.py可以同属db包 - 方便大型项目管理:把登录、权限、日志等功能拆成不同子包,结构清晰,避免单个模块过大
- 第三方库如
requests、flask其实都是包,安装后看到的是一个文件夹,不是单个.py
模块和包的关键区别
区别不在功能强弱,而在组织粒度和用途:
立即学习“Python免费学习笔记(深入)”;
-
物理形态:模块 = 单个
.py文件;包 = 含__init__.py的目录 -
导入行为:导入模块直接加载代码;导入包会先执行其
__init__.py,再按需加载子模块 -
命名空间表现:
import package.module是常见写法;而from package import module会让module成为当前命名空间的一个名字 -
相对导入支持:只有在包内才能用
from . import xxx或from ..utils import helper这类语法
面试容易踩的坑
面试官常通过细节判断你是否真用过,不是只背概念:
-
__init__.py为空也必须存在——删掉它,import mypkg就会报ModuleNotFoundError -
from xxx import *在模块中不推荐,在包中更危险:需在__all__ = ["func1", "ClassA"]中显式声明才安全 - 包的导入路径依赖
sys.path和当前工作目录,运行时报错“找不到模块”往往是因为没正确设置入口或没用-m参数运行 - 不要混淆“库”(library):它不是 Python 语言层面的概念,而是对一组相关模块/包的统称(如“NumPy 库”包含多个包和 C 扩展)










