有没有办法将Python中的字典提取到本地命名空间?

6 投票
3 回答
1474 浏览
提问于 2025-04-15 19:37

PHP有一个叫做extract()的函数,它可以接收一个关联数组作为参数,然后根据数组的键创建局部变量,并把这些键的值赋给对应的变量。请问在Python中有没有类似的做法?我快速搜索了一下,没找到具体的方法。我猜可能可以用exec()来实现,但如果有个现成的函数来帮我就更好了。

3 个回答

-1

修改 locals() 这个字典可能是个解决办法,但文档上说,http://docs.python.org/library/functions.html#

注意:这个字典的内容 不应该被修改;因为修改可能 不会影响解释器使用的 本地和自由变量的值。

那么问题来了,你为什么还需要它呢?可能有更好的方法来实现你想要的效果。

另外,为什么你不能直接访问字典或者把它们赋值给变量呢?

4

试试这个:

    locals().update(my_dict)

补充:

gnibbler 提出了一个很重要的观点,那就是不应该修改局部变量(可以查看这个链接了解更多:http://docs.python.org/library/functions.html#locals)。不过,Python 的文档并没有说这样做不安全,只是说修改局部变量可能不会影响变量的值。在回答这个问题之前,我在我的 Python 2.6 的 IDLE 中试过,发现更新局部变量实际上是可以的,无论是在全局范围内还是在函数内部。这就是为什么我不删除我的回答,而是添加一个警告,说明在某些(可能与平台有关的?)情况下它可能有效,但并不能保证。

5

因为修改 locals() 返回的字典是 不安全 的。

>>> d={'a':6, 'b':"hello", 'c':set()}
>>> exec '\n'.join("%s=%r"%i for i in d.items())
>>> a
6
>>> b
'hello'
>>> c
set([])

不过像这样使用 exec 看起来很糟糕。你应该重新设计一下,这样就不需要动态地往你的本地命名空间里添加东西了。

补充:看看 Mike 在评论中对使用 repr 的一些顾虑。

>>> d={'a':6, 'b':"hello", 'c':set()}
>>> exec '\n'.join("%s=d['%s']"%(k,k) for k in d)
>>> id(d['c'])
3079176684L
>>> id(c)
3079176684L

撰写回答