-6ren">
gpt4 book ai didi

python - 为什么 "import module"和 "from module import * "中全局变量的行为不同?

转载 作者:太空狗 更新时间:2023-10-29 21:25:50 31 4
gpt4 key购买 nike

让我们让 a.py 成为:

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

在控制台,如果我简单地导入,事情对我来说很有意义:

>>> 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

我读过关于为什么人们不喜欢从 namespace 角度看“from module import *”的观点,但我找不到关于此行为的任何信息,坦率地说,我发现这是我偶然遇到的问题。

最佳答案

当您请求 a.spam 时,会在模块 a 中进行命名空间搜索,并找到 spam。但是当你只请求 spam 时:

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

spam 是在 namespace a 中创建的(尽管您不能通过这样的导入访问它),但不是在当前模块中。似乎没有人答应我们将新添加的 a 全局变量添加到所有已通过 * 导入的命名空间模块 a。这将需要在解释器中存储导入链接,如果一个大量导入的模块一直执行此类技巧,则可能会降低性能。

假设您在调用 foo() 之前在主模块中定义了 spam。那将是彻头彻尾的名称冲突。

如图所示,您可以执行 from a import * 来获取模块 a 的最新更新:

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

关于python - 为什么 "import module"和 "from module import * "中全局变量的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33687904/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com