Python中“import module; import module as blah”与“import module; blah=module”是否有实质差异?
两种模块别名写法的实质差异
除了可读性之外,这两组代码在大多数常规场景下没有实质差异,但存在极端情况的区别:
核心前提:Python的模块是单例模式,第一次
import module会加载模块并在当前命名空间创建module变量指向该模块对象;后续的import操作不会重复加载,只是绑定新的引用。对于
import module ; import module as blah:
第二次的import module as blah是通过导入语法在命名空间创建blah别名,直接指向原始的模块对象——哪怕之前module变量被重新赋值(比如module = 123),blah依然会绑定到最初的模块对象。对于
import module ; blah = module:
这是纯粹的变量赋值操作,blah会完全继承当前module变量的指向。如果在赋值前module变量被改成了其他值(比如module = 123),blah就会指向这个新值,而非原始模块对象。
举个具体例子:
# 第一种写法:即使module被重新赋值,blah仍是模块对象 import sys sys = "hello" import sys as blah print(type(blah)) # 输出 <class 'module'> # 第二种写法:blah会跟随module的新值 import sys sys = "hello" blah = sys print(type(blah)) # 输出 <class 'str'>
另外还有个细微区别:import module as blah属于导入语句,在语法层面会被Python解释器当作导入操作处理;而blah = module只是普通变量赋值,不会触发任何模块加载逻辑(不过在你的提问场景里已经提前导入过模块,所以这点差异不会体现)。
内容的提问来源于stack exchange,提问作者Peter Fletcher
相关产品推荐
相关产品推荐

