Spyder中不同作用域导入的matplotlib.pyplot是否为同一对象?
问题解答
1. 函数内的plt与控制台的plt是否为同一对象?
是同一对象。Python的模块采用单例机制,同一个模块无论在哪个作用域中导入,都会指向内存中同一个实例。也就是说,你在控制台顶层执行import matplotlib.pyplot as plt,和在TKraiseCFG函数内部执行相同的导入语句,得到的plt变量都指向matplotlib.pyplot模块本身。
你可以直接验证:在TKraiseCFG函数里添加一行print(plt is globals()['plt']),然后在控制台调用该函数,输出结果会是True,证明二者指向同一对象。
2. 无需依赖调用者命名空间的模块访问方法
有两种可靠的方式:
- 在目标作用域内直接导入模块:不管当前作用域外部有没有定义
plt变量,只要在需要使用模块的地方执行import matplotlib.pyplot as plt,就能直接获取到模块对象。因为模块只会被加载一次,后续导入都是复用已有的实例,不会重复加载。 - 通过
sys.modules字典获取:Python会将所有已加载的模块存储在sys.modules中,键为模块的完整名称。你可以先导入sys模块,然后通过plt = sys.modules['matplotlib.pyplot']直接获取到模块对象,这种方式完全不依赖任何外部命名空间的变量。
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

