Python中from os import path与import os.path as path的差异问询
Python两种
os.path导入方式的差异答疑 原始提问内容
各位Stack Overflow社区的朋友你们好,我想了解以下两条语句的差异:
from os import path # importing symbol import os.path as path # importing module as symbol?
该问题此前被标记为导入相关主题的重复问题,我希望对问题进行延伸提问。
在相关重复问题的回答中,Michael Ray Lovett提到:导入模块会全局影响模块内变量,而仅导入符号只会影响本地实现。
我想咨询以下两个问题:
- 上述两种导入方式是否都仅导入受本地作用域影响的符号,还是第二种模块导入方式支持对变量的全局修改?
- 导入模块的内存占用是否更低?因为单独导入符号会在每次导入时生成独立变量,会占用内存空间。
答疑内容
1. 关于作用域与全局修改的问题
首先明确核心结论:两种写法最终绑定到本地path变量的是完全相同的对象,两者在修改生效范围上的表现完全一致,不存在某一种仅本地生效、另一种支持全局修改的差异。os.path本身就是一个模块对象,Python的模块导入是全局单例模式,整个解释器进程中只会存在一份os.path模块实例。不管你用哪种方式导入,拿到的都是这个全局唯一实例的引用:
- 如果你修改的是
path对象的属性(比如path.some_custom_attr = "test"),这个修改会全局生效,所有其他导入了os.path的代码读到的该属性值都会同步更新,两种导入方式下该行为完全相同。 - 如果你只是给本地
path变量重新赋值(比如path = "./test"),那只是修改了当前作用域下变量的指向,完全不会影响全局的os.path模块,两种导入方式下该行为也完全相同。
你看到的“导入模块全局生效、导入符号仅本地生效”的表述,是针对导入模块下的普通属性(比如函数、常量)的场景:比如你有模块a,里面有变量b = 1,如果你用import a导入,修改a.b = 2会全局生效;如果你用from a import b导入,修改本地的b = 2只是修改本地变量指向,不会影响模块里的b的值。但这个场景和你当前的案例不一样,因为你from os import path导入的path本身就是模块对象,不是普通的变量/函数属性。
2. 关于内存占用的问题
两种导入方式的内存占用没有可感知的差异,不存在“单独导入符号占用更多内存”的情况。
前面已经提到,Python的模块是全局单例的,导入操作不会生成新的模块/属性副本,只是给当前作用域新增一个变量绑定到对应的对象引用上。不管是哪种导入方式,你都只额外占用了一个本地变量引用的内存,大小仅为几个字节,完全可以忽略不计。
内容的提问来源于stack exchange,提问作者ulasfo
相关产品推荐
相关产品推荐

