为何仅导入sys.dont_write_bytecode不生效?能否避免导入整个sys库?
问题原因与解决方案
为什么两种写法效果不同?
这是因为Python中不可变类型的导入是值拷贝,而非引用:
- 当你用
from sys import dont_write_bytecode时,你拿到的是sys.dont_write_bytecode当前值的一个副本(布尔值属于不可变类型)。之后修改这个本地副本dont_write_bytecode = True,只会改变这个局部变量的值,完全不会影响sys模块内部的原始dont_write_bytecode变量,所以Python依然会生成__pycache__文件夹。 - 而
import sys后修改sys.dont_write_bytecode = True,是直接操作sys模块命名空间里的原始变量,这个修改会被Python的模块导入机制识别到,从而阻止生成字节码缓存文件。
能不能不导入整个sys库?
可以,但本质上还是需要访问sys模块的命名空间:
- 直接用
import sys其实完全没有额外负担——Python的模块导入是单例模式,导入整个sys模块的开销可以忽略不计,而且代码可读性更高。 - 如果非要追求“只关联目标属性”,可以用
__import__函数间接获取模块对象:
但这和直接sys = __import__('sys') sys.dont_write_bytecode = Trueimport sys没有本质区别,反而降低了代码可读性,不推荐。
另外还有一种替代方案:运行Python脚本时加上-B命令行参数(比如python -B your_script.py),全局禁用字节码缓存,不需要在代码里做任何设置。
内容的提问来源于stack exchange,提问作者user18362633
相关产品推荐
相关产品推荐

