Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入到_uinit_uuu.py中_Python - Fatal编程技术网

Python 导入到_uinit_uuu.py中

Python 导入到_uinit_uuu.py中,python,Python,这是我的项目结构(Python 3.5.1.): 案例1 文件b.py为空 文件\uuuu init\uuuu.py是: print(b) import a.b print(b) 如果我们运行导入,则输出为: NameError: name 'b' is not defined <module 'a.b' from '/tmp/a/b.py'> 案例2 文件b.py为空 文件\uuuu init\uuuu.py是: print(b) import a.b print

这是我的项目结构(Python 3.5.1.):

案例1
  • 文件
    b.py
    为空

  • 文件
    \uuuu init\uuuu.py
    是:

    print(b)
    
    import a.b
    print(b)
    
如果我们运行
导入
,则输出为:

NameError: name 'b' is not defined
<module 'a.b' from '/tmp/a/b.py'>
案例2
  • 文件
    b.py
    为空

  • 文件
    \uuuu init\uuuu.py
    是:

    print(b)
    
    import a.b
    print(b)
    
如果我们运行
导入
,则输出为:

NameError: name 'b' is not defined
<module 'a.b' from '/tmp/a/b.py'>

问题: 为什么程序在案例2中没有失败


通常,如果我们运行
import a.b
,那么我们只能通过
a.b
引用它,而不能通过
b
引用它。希望有人能帮助解释案例2中的名称空间发生了什么。

一个
import
语句将模块引入范围。您导入了
b
,因此它就是一个模块对象

请阅读以下文档:

基本导入语句(no from子句)分两步执行:

  • 查找模块,必要时加载并初始化它
  • 在本地命名空间中为发生import语句的作用域定义一个或多个名称

在第一种情况下,您没有导入
b

Python在导入后将模块作为全局变量添加到父包中

因此,当您导入
a.b
时,名称
b
作为全局名称添加到
a
模块中,该模块由
a/\uu init\uuuuuuuuuuupy
创建

从:

当使用任何机制加载子模块时(例如importlib API、import或import from语句或内置的
\uuuu import\uuuu()
),会在父模块的命名空间中放置一个到子模块对象的绑定。例如,如果包
spam
具有子模块
foo
,则导入
spam.foo
后,
spam
将具有绑定到子模块的属性
foo


我的。请注意,这同样适用于Python2,但Python3使过程更加明确。

我认为这可能是因为
b
通过
import a.b
语句引入了
a
的命名空间。但我不确定细节。我也不知道它是否是明确支持的功能。@shx2
a
b
<代码>a应该在那里。但是为什么
b
也存在呢?我能猜到的最合乎逻辑的事情是:
a
被引入当前范围,然后
b
被引入
a
的范围。但是当前范围与执行
a/\uuu init\uuuu.py
a的范围相同。需要确认。@shx2:是的,这就是问题的重点。为什么
b
也在那里?它从未被明确导入<代码>导入a.b
通常只添加
a
。如果案例1失败,我不会感到非常惊讶。如果运行
导入a.b;在
主脚本中打印(b)
,然后它将失败。但是在这里的案例2中它并没有失败。@BarryTheHatchet:
import a.b
将名称
a
绑定到命名空间中。这里的特殊之处在于
b
a
的子模块,因此导入内部组件在
a
的命名空间中设置名称
b
。这将导致一个全局
b
,其中
a
的名称空间,即
\uuuu init\uuuuuuuuuuuuuuuupy
。如果这是任何其他模块,
b
的名称就不会像这样出现。@BarryTheHatchet:换句话说,在第二种情况下,他们也没有导入
b
,但还是添加了它。