为什么访问全局变量通过导入模块工作,而不是从模块导入var?

时间:2017-04-03 10:07:43

标签: python import module globals

我一直在阅读和学习有关python的知识,但所有导入不同的导入变量都有点令人困惑。

我遇到的问题是,我导入的全局变量始终是默认值,即使我在该模块中调用了一个操作它的方法。我这样导入了它:

from fona import connect, disconnect, CON

前两个是函数,最后一个是var。前两个打开或关闭连接,我可以通过var CON访问。当我这样做时,CON将保持None,即使connect正在初始化它(我有很多详细的输出来验证)。我越来越乱,并且无法弄明白。在我有更多想法之前,写了一篇与此文章截然不同的帖子。

import fona

然后我通过fona.connect / disco / CON访问所有内容。然后它工作。我正在努力理解为什么并且找不到任何资源。是什么让这些进口不同?我非常喜欢from x import y as z,但在这种情况下我似乎无法使用它。

2 个答案:

答案 0 :(得分:1)

from fona import CON

与*完全相同:

import fona
CON = fona.CON

现在,如果fona在内部发生更改,以便fona.CON替换为新值,则这对您自己的变量没有影响。就像你说:

y = 1
x = y
y = 2
即使x现在为2,

y仍为1。

*除了后者留下名字fona,前者没有。

答案 1 :(得分:1)

在Python中,"全球"意味着"模块级" (实际上在运行时a" global"变量是module对象实例的属性)。

现在声明:

from fona import CON

是语法糖:

import fona
CON = fona.CON 
del fona

所以此时我们有两个指向同一个对象的名字 - fon.CON<yourothermodule>.CON

现在如果在fona中我们有一个重新绑定fona.CON的函数,即:

def foo():
    global CON
    con = "XXX"

调用此函数只会重新绑定fona.CON,而不是CON中的<yourothermodule>变量。

如果您导入整个fona模块并使用fona.CON,则在调用fona.foo()后确实会看到重新绑定的效果,因为您实际上正在访问fona模块& #39; s属性,而不是本地(local to)属性。

实际上你会在同一个模块中使用两个dicts的情况完全相同:

d1 = {"a":1}
d2 = {}
d2["a"] = d1["a"]
d1["a"] = 42 # this won't change d2["a"]
print d1, d2

事实上你甚至不需要dicts,只需要在同一名称空间中有两个名字就足够了:

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> a = 1
>>> b = a
>>> print a
1
>>> print b
1
>>> b is a
True

正如您所看到的,此时b不是一个副本&#39;在a中,它实际上只是绑定到同一个对象的另一个名称。现在,如果我们重新绑定a

>>> a = 2
>>> print a
2
>>> print b
1
>>> b is a
False
>>> 

我们可以看到它不会影响b,只会使a指向另一个对象。