<p>from module import * 可快速导入所有公开名称,适合交互式探索,但易导致命名空间污染、可读性差;推荐按需导入、模块别名或定义 all 限制导出。</p>

import * 在 Python 中允许一次性导入模块中的所有公开名称(即不以下划线开头的变量、函数、类等),但实际使用中需谨慎权衡。
优点:简洁快速,适合探索性开发
在交互式环境(如 Jupyter、IPython)或快速原型编写时,from module import * 可省去逐个写导入语句的步骤,减少代码行数,加快临时测试节奏。例如调试 math 模块时,直接 from math import * 后就能用 sin()、sqrt() 等,无需前缀。
缺点一:命名空间污染,引发隐式覆盖
多个 import * 可能导致同名标识符被后导入的覆盖,且不易察觉:
-
from os import *和from shutil import *都含copy函数,后者会覆盖前者 - 本地定义的变量若与导入名重复(如
path = "data.txt"),会被from os import *中的path模块覆盖
缺点二:可读性与可维护性严重下降
读者无法从代码中直观判断某个函数/变量来自哪个模块,增加理解成本和调试难度:
- 看到
log(10),无法确定是math.log还是numpy.log - IDE 自动补全和静态检查(如 mypy、pylint)基本失效
- 重构或替换模块时,难以定位依赖来源
替代方案更安全可控
推荐使用明确导入方式,兼顾清晰性与便利性:
- 按需导入:
from math import sin, cos, pi - 模块别名导入:
import numpy as np,调用np.array() - 限制 * 导入范围:在模块中定义
__all__ = ['func_a', 'ClassB'],控制import *暴露的内容






