想象一下这种情况,你有两个文件说 p1.py 和 p2.py 。
p1.py:
a=5
p2.py:
from p1 import *
print(a) # NameError: name 'a' is not defined
print(p1.a) # NameError: name 'p1' is not defined
第一个印刷声明是可以理解的。我对第二次印刷声明感到难以置信。
from p1 import *
应该导入p1.py中的所有内容,为什么我无法访问p1.a变量。这不是结束,有趣的部分从这里开始。现在考虑下面给出的修改:
import p1
print(p1.a) # prints a = 5
那我在这里错过了什么?来自@ThiefMaster的In this answer他说那个
from foo import *
将a
导入到本地范围。将值分配给a
时,会将其替换为新值 - 但不会触及原始foo.a
变量。因此,除非您
import foo
并修改foo.a
,否则两次调用都会返回相同的值。
所以我修改了p1.a,但为什么它不起作用?
答案 0 :(得分:1)
你写了“from p1 import *
应该导入p1.py中的所有内容,为什么我无法访问p1.a变量“
它确实导入了来自 in p1
模块的所有内容,但模块p1
不包含任何名为p1
的变量,因此在此import语句之后p1
未定义。如果您执行import p1
,则可以访问p1.a1
。
如果您声明,模块p1
包含a=5
,那么与您编写的第一个打印语句print(a)
相反的情况将会成功,因为from p1 import *
会在主要内部创建变量与a
内的变量p1
具有相同名称和值的模块。
答案 1 :(得分:0)
这是导入模块的两种方式。
import foo
from foo import foo1, foo2
什么是模块?
模块是包含Python定义和语句的文件。 在模块中,您可以使用全局变量
__name__
访问模块的名称。
正如您所看到的,模块包含Python定义和语句,简而言之就是函数,类等可执行语句。它们用于初始化模块。因此,它们将在第一次导入时执行。
每个模块都有自己的 PRIVATE SYMBOL TABLE ,它由模块内的所有函数和变量使用。这可以防止模块和用户的作者使用的变量意外冲突。
因此,在您的情况下,p1.py
和p2.py
都将拥有自己的私有表,其中包含相应脚本可以使用的所有变量的列表。
当你做这样的事情时:
import p1
它创建了一个表,其中还引入了模块名称,即p1
。
另一种变体:
from p1 import *
确实创建了一个表,但它无法在其符号表中导入模块的名称。换句话说,p1
缺失。这包括表中的所有内容,模块的名称和变量以下划线(_
)开头。
在大多数情况下,Python程序员不使用此工具,因为它在解释器中引入了一组未知的名称,可能隐藏了您已定义的一些内容。
请注意,一般来说,从模块或包导入*的做法不受欢迎,因为它经常会导致代码难以理解。但是,可以使用它来保存交互式会话中的输入。
这可能是help.