您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如果我只是从numpy模块引用它,为什么我必须从numpy导入它

如果我只是从numpy模块引用它,为什么我必须从numpy导入它

这是因为numpy.matlib它的一个可选子包numpy必须单独导入。

使用此功能的原因可能是:

当您导入时numpy没有子包时matlib,Python将寻找.matlibnumpy包的属性numpy没有导入,尚未分配此属性numpy.matlib(请参见下面的讨论)

如果您想知道为什么np.matlib.identity无需使用关键字就可以工作npm,那是因为在导入子模块时matlib,将为父模块numpy(以np您的情况命名)提供一个matlib绑定到子模块的属性。这只有在您首先定义时才有效numpy

参考

当使用任何机制(例如importlib API,import或import-from语句或内置 ())加载子模块时,在父模块的名称空间中将绑定到子模块对象。

导入内容的选择__init__.py在模块目录中模块的相应文件中确定。您可以使用该dir()函数查看各个模块定义的名称

>> import numpy

>> 'matlib' in dir(numpy)
# False

>> import numpy.matlib

>> 'matlib' in dir(numpy)
# True

另外,如果您直接查看__init__.py文件,numpy则会看到没有导入matlib

如果您想知道如何 平滑地 复制名称空间;

matlib源代码运行此命令在复制numpy命名空间:

import numpy as np                                    # (1)
...
# need * as we're copying the numpy namespace
from numpy import *                                   # (2)
...
__all__ = np.__all__[:] # copy numpy namespace        # (3)

第(2)行from numpy import *特别重要。因此,您会注意到,即使只是导入numpy.matlib,仍可以使用所有numpy模块而无需导入numpy

没有第(2)行,第(3)行中的名称空间副本将仅附加到子模块。有趣的是,由于第(3)行,您仍然可以像这样执行一个有趣的命令。

import numpy.matlib               
numpy.matlib.np.matlib.np.array([1,1])

这是因为将np.__all__附加到的npof numpy.matlib(它是通过行(1)导入的)。

其他 2022/1/1 18:35:46 有541人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶