Why is globals() a function in Python?
python提供了函数globals()来访问所有全局变量的字典。为什么这是一个函数而不是一个变量?以下工作:
1 2 3
| g = globals()
g["foo"] ="bar"
print foo # Works and outputs"bar" |
在函数中隐藏全局的基本原理是什么?如果只调用一次并将引用存储在某个地方,或者每次需要时都应该调用它,这更好吗?
imho,这不是python中globals()的原因的副本吗?因为我不是在问为什么globals()存在,而是为什么它必须是一个函数(而不是变量__globals__)。
- 在调试之外,您应该很少需要访问全局数据,这是相关的stackoverflow.com/questions/12693606/…
- 我想如果它是一个变量,那么它将使用有用的空间存储在虚拟内存中。作为一个函数,它允许您在实际需要时(并非总是)存储这些信息。我猜函数会去搜索全局变量。所以如果你不叫它,就不用额外的内存了…我不确定这一切,这只是我的猜测。
- 我认为回答这个问题需要具体的历史知识,但是考虑到locals必须是一个函数(调用时需要更新dict),我怀疑globals是一个与locals对称的函数。
- 请参阅此答案:stackoverflow.com/a/12694065/3516028。不完全是你在寻找什么,但实际上当你认为全局变量可以改变时,最好有一个函数在你搜索时收集所有变量,而不是有一个变量解释程序必须自己更新。
- @我也读过那条线。我的特殊原因是我想在一个repl环境中工作。并且使用i python-i workspace.py给了我一个有效的python shell。不过,我需要从文件中加载一些全局变量,这就是global s()发挥作用的地方。
因为它可能取决于Python实现构建字典的工作量。
在cpython中,全局只保存在另一个映射中,调用globals()函数返回对该映射的引用。但是其他的Python实现可以根据需要为对象自由地创建一个单独的字典。
这反映了locals()函数,在cpython中,由于局部变量通常存储在一个数组中(本地名称转换为cpython字节码中的数组访问),因此必须根据需要创建一个字典。
因此,当需要访问全局名称映射时,您可以调用globals()。在cpython中存储对该映射的引用是有效的,但在其他实现中不要指望其他引用。
- 在引入globals时,支持其他python实现是不是一个问题?
- @用户2357112:我不这么认为,但我认为保持全局内部实现不受假设的影响是很重要的。
- 你认为我可以指望"globals()["foo"]="bar'"在其他实现中工作吗?
- @Rolfsievers:文件不能保证,不。