在Python3.x中访问导入的全局变量的正确方法是什么?

时间:2017-07-13 12:41:18

标签: python-3.x import

想象一下这种情况,你有两个文件说 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,但为什么它不起作用?

2 个答案:

答案 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.pyp2.py都将拥有自己的私有表,其中包含相应脚本可以使用的所有变量的列表。 当你做这样的事情时:

import p1

它创建了一个表,其中还引入了模块名称,即p1

另一种变体:

from p1 import *

确实创建了一个表,但它无法在其符号表中导入模块的名称。换句话说,p1缺失。这包括表中的所有内容,模块的名称和变量以下划线(_)开头。

在大多数情况下,Python程序员不使用此工具,因为它在解释器中引入了一组未知的名称,可能隐藏了您已定义的一些内容。

请注意,一般来说,从模块或包导入*的做法不受欢迎,因为它经常会导致代码难以理解。但是,可以使用它来保存交互式会话中的输入。

这可能是help.