我一直在阅读和学习有关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
,但在这种情况下我似乎无法使用它。
答案 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
指向另一个对象。