修改globals()的输出是否安全?
locals()函数的文档特别提醒不要修改它的输出,因为解释器可能不会反映在本地作用域中的变化。我猜这意味着Python的规范并不要求这样做,尽管在CPython中是可以的。
我想知道globals()是否也一样。虽然在文档中没有警告,但我觉得奇怪的是这两个函数会有不同的行为,因为它们显然是在不同的作用域上执行相同的操作。
如果修改globals()的输出是安全的,那会让我的一个项目变得更简单和兼容。
1 个回答
27
修改 locals()
的效果并不总是可靠,即使是在 CPython 中也是如此。在模块和类的范围内,它偶尔能奏效,但在函数内部就不行了(因为在函数里,locals()
提供的是本地命名空间的一个副本,而不是实际的引用,所以你做的修改不会生效)。
不过,globals()
就不一样了,因为它总是指向模块的命名空间,而模块的命名空间必须像普通字典那样工作。所以,globals()
没有警告并不是一个疏忽,这确实是被允许的。