Python:为什么可以';我是否使用locals()修改函数中的当前作用域?

Python:为什么可以';我是否使用locals()修改函数中的当前作用域?,python,scope,introspection,Python,Scope,Introspection,为什么创建/修改locals()的成员在函数中不起作用 Python 2.5 (release25-maint, Jul 20 2008, 20:47:25) [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> # Here's an example of

为什么创建/修改locals()的成员在函数中不起作用

Python 2.5 (release25-maint, Jul 20 2008, 20:47:25)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> # Here's an example of what I expect to be possible in a function:
>>> a = 1
>>> locals()["a"] = 2
>>> print a
2

>>> # ...and here's what actually happens:
>>> def foo():
...  b = 3
...  locals()["b"] = 4
...  print b
...
>>> foo()
3

为什么会这样?它的设计目的是返回一个表示,而不是用于编辑本地数据。正如警告的那样,它永远不能保证作为这样的工具工作。

locals()返回名称空间的副本(这与globals()的功能相反)。这意味着您对locals()返回的字典所做的任何更改都将无效。查看示例4.12。

Ah,我没有看到,因为我只阅读了联机帮助()。谢谢。@Devin,因为这是最不令人惊讶的行为,尤其是因为你可以用类似的方式修改globals。这是一个公平的抱怨。值得一提的是,它是以这种方式工作的,因为Python以一种不可能的方式加速了本地访问,而全局名称空间没有进行这样的优化(尽管有人建议这样做,例如PEP 266)。可以说,这是一个应该消失的漏洞百出的抽象概念。我个人的偏好是让globals()像locals()现在那样工作,而不是让locals()像globals()现在那样工作。不管怎样,我的回答更多的是暗指医生而不是直觉。它不会这样做,因为文档没有说它应该这样做。你为什么要这样做呢?我想使用外部获取的数据初始化一个变量负载。所以我的想法是:1将所有变量声明为“=None”2创建一个varname->external source path 3的映射迭代映射,设置变量或因错误而中止,但我在设置变量时遇到了问题。很抱歉,重新提出一个旧问题,但我想做同样的事情:我有一个dict,我想把dict的所有元素都转换成局部变量(所以我可以说foo而不是options.foo)。我现在用eval来做这个,但它很难看。没有其他办法吗?@garyo:这可能是另一个问题,但我想出了一个新的本地方法,名为
mwahaha
,并将其设置为
“thingy”
导入检查;inspect.stack()。