python - 为什么可以通过 import module 访问全局变量,而不是通过 module import var 访问全局变量?

标签 python import module global

我一直在阅读和学习大量有关 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,但在这种情况下我似乎无法使用它。

最佳答案

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

现在这个声明:

from fona import CON

是语法糖:

import fona
CON = fona.CON 
del fona

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

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

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

调用此函数只会重新绑定(bind)fona.CON ,而不是 CON变量 <yourothermodule>

如果您导入整个 fona模块及使用fona.CON调用fona.foo()后您确实看到了重新投标的效果因为您实际上正在访问 fona模块的属性,而不是您的本地(local to)属性。

实际上,同一模块中的两个字典会遇到完全相同的情况:

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

事实上,您甚至不需要字典,只需同一 namespace 中的两个名称就足够了:

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不是 a 的“副本” ,它实际上只是绑定(bind)到同一对象的另一个名称。现在如果我们重新绑定(bind)a :

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

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

关于python - 为什么可以通过 import module 访问全局变量,而不是通过 module import var 访问全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43181797/

相关文章:

3D图中的Python图例

python - 将 "scripts"作为 Python 包的一部分安装在 setup.py 中,位于用户路径上并被识别为 Python 脚本

Python fbs - 模块导入在卡住后不起作用

Python类编译后无法更新

python - jinja2:默认布局

android - 我在哪里可以获得 JAR 来导入 libcore.io?

r - 如何使用 R "readLines"命令从大文件中读取选定的行并将它们写入数据框?

Python 类与模块属性

perl - 安装 Bio::DB::Sam perl 模块

Python UDP客户端没有响应