我的理解是,从pickle中加载一个非内置类型的对象时,会导入该模块。例如, pickle无法导入已存在的模块?表明要解析的对象类型对应的模块必须存在于同一路径下。
然而,当我尝试反序列化一个NumPy的ndarray时,反序列化成功了,但是似乎没有导入模块:
In [12]: with open('numpysample.pkl', 'rb') as input:
...: a = pickle.load(input)
In [14]: type(a)
Out[14]: numpy.ndarray
In [13]: numpy
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-13-8d40275025d1> in <module>
----> 1 numpy
NameError: name 'numpy' is not defined
这里正在发生什么?
numpy
会非常快,因为它不会再次导入numpy
,而是只是从sys.modules
中获取缓存的导入。 - ShadowRangersys.modules
,确实如你所说。我理解pickle
导入了numpy
,但是可以这样说没有命名空间导入numpy
吗?我这么说是因为没有将模块绑定到名称(仅在sys.modules
字典中作为值引用)。 - rishai__import __()
不绑定要加载的模块的名称,而且在外部无法访问mod
,因此没有一个名称可以用来直接引用未选择对象的类/模块。但是我想我们也可以从dir()
或globals()
中知道这一点。 - rishai