为什么在“导入模块”和“从模块导入*”中,全局变量的行为不同?

用户4574

让我们让a.py是:

def foo():
    global spam
    spam = 42
    return 'this'

在控制台上,如果简单地说import a,对我来说很有意义:

>>> import a
>>> a.foo()
'this'
>>> a.spam
42

但是,如果我做的不太受欢迎,并且...

>>> from a import *
>>> foo()
'this'
>>> spam
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> a.spam
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

from module import *从名称空间的角度来看,我已经读过关于人们为什么不喜欢“ ”的观点,但是我对此行为一无所获,坦率地说,我发现这是我偶然遇到的问题。

u354356007

当您询问时,a.spam会在模块中进行名称空间搜索aspam找到。但是,当您只要求spam

>>> from a import *  # imported foo, spam doesn't exist yet
>>> foo()

spam是在命名空间a中创建的(尽管您不能通过这种导入方式来访问它),但是不在当前模块中创建。似乎没有人答应过我们要向已通过via导入的a所有名称空间模块添加新添加的globals 这将需要将导入链接存储在解释器内部,并且如果一个始终大量导入的模块始终在执行此类操作,则可能会降低性能。a*

想象一下您spam在调用之前已经在主模块中定义foo()那将是彻头彻尾的名字冲突。

就像说明一样,您可以from a import *获取模块的最新更新a

from a import *
print(foo())
from a import *
print(spam)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从模块导入的全局变量不会更新-为什么?

导入模块中的全局变量

从模块导入全局变量

覆盖从其他模块导入的函数中的全局变量

从python中的其他模块导入单个全局变量

导入模块中全局变量的可见性

Python名称空间和导入:在导入的模块中设置全局变量的值会创建另一个不相关的全局变量吗?

为什么根据Lua中的模块,将模块加载到局部变量或全局变量意味着结果不同?

是否可以将模块注入到导入模块的全局变量中?

在 Gatsby 和 Storybook 中,CSS 模块导入的行为不同

Python-导入模块获取全局变量

导入模块时看不到全局变量的更改

当未定义默认导出时,“模块”中的导入模块会导入什么?为什么它与作为模块导入*不同?

导入模块中声明的全局变量的可见性

Javascript将文件中的所有模块作为全局变量导入

交互模式与非交互模式下,相同代码中的导入行为不同-为什么模块搜索路径不同?

为什么导入函数定义的全局变量不改变?

为什么声明的顺序关系在模块注释全局变量?

为什么从定制模块导入的函数在JSfiddle中工作时行为会有所不同?

为什么更新全局变量在导入函数中定义的函数中不起作用

什么是模块变量与全局变量?

不同模块之间的全局变量

全局变量跨python中的模块和线程

Python模块和全局变量

Webpack中的“导入全局变量”

Python-将全局变量作为导入模块的参数传递

导入全局模块问题

全局变量在模块中的作用域

为什么有不同的方式在JavaScript中导入模块?