导入模块时的奇怪行为

时间:2013-01-30 16:09:07

标签: python python-import

我有一个叫做“package”的Python包。在其中我有空__init__.py和两个模块。一个叫m1.py,只包含一行:

x = 3

另一个名为m2.py并包含以下行:

x = 5

现在我尝试使用那些模块。首先,我做了类似的事情:

from package.m1 import x
print package.m1.x

当然它不起作用 - 我得到这样的错误:

NameError: name 'package' is not defined

我明白为什么它不起作用。但后来我做了类似的事情:

from package.m1 import x
import package.m2
print package.m1.x

现在它确实有效。为什么?怎么样?我没有导入package.m1!

2 个答案:

答案 0 :(得分:2)

我只有一个解释:

  1. from package.m1 import x加载模块packagepackage.m1m1模块中添加了package,但未将package添加到您的全局变量中。
  2. import package.m2现在将package模块添加到您的全局变量中。由于m1已经是package的一部分,现在可以通过package.m1访问。
  3. 进一步测试:

    >>> from package import m1
    >>> package.m1
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'package' is not defined
    >>> import package.m2
    >>> package.m1
    <module 'package.m1' from 'package/m1.py'>
    >>> from package import m3
    >>> package.m3
    <module 'package.m3' from 'package/m3.py'>
    

    测试继续:

    >>> import package.m1
    >>> del package
    >>> import package
    >>> package.m1
    <module 'package.m1' from 'package/m1.py'>
    

答案 1 :(得分:0)

from x import y语法导入整个模块,然后引用当前命名空间中的指定对象。它可以翻译为:

import x
y = x.y

所以,你实际上是在导入package.m1

相关问题