应避免使用 from module import *,因其易引发名称冲突(如math.sqrt被numpy.sqrt覆盖)、降低可读性与可维护性(无法追溯log来源)、引入隐藏依赖(模块更新导致意外错误);推荐用import module、from module import func或import module as mod。

因为这会污染当前命名空间,导致名称冲突、可读性下降和维护困难。
容易引发名称冲突
当多个模块都用 from module import * 导入时,后导入的同名对象会覆盖前面的。比如:
- from math import * 导入了 sqrt
- from numpy import * 也导出 sqrt(功能不同)
- 之后调用 sqrt(4) 实际执行的是 numpy.sqrt,可能返回数组而非数值,引发隐蔽错误
降低代码可读性和可维护性
读者无法从代码中直接看出某个函数来自哪个模块:
- 看到 log(10),不知道是 math.log 还是 numpy.log 或 logging.log
- 重构或调试时难以定位来源,IDE 也无法准确跳转或提供补全
- 团队协作中,别人阅读你的代码成本显著上升
隐藏依赖,影响可移植性
import * 会把模块中所有公有名称(__all__ 定义的,或未以下划线开头的)一股脑拉进来:
立即学习“Python免费学习笔记(深入)”;
- 如果模块内部更新,新增/删减了导出名,你的代码可能突然报错或行为改变
- 某些模块未正确定义 __all__,import * 可能意外导入大量内部辅助函数,这些本不该被外部使用
- 打包或分析依赖关系(如用 pydeps)时,工具难以准确识别真实依赖
替代方案更清晰可靠
推荐使用明确、可控的导入方式:
- import module:用 module.func(),语义清晰,避免冲突
- from module import func1, func2:只导入需要的少数几个,一目了然
- import module as mod:缩写简洁,又保留归属信息(如 np.array、pd.DataFrame)










