如何在Python中按名称设置变量?

时间:2012-07-27 12:32:00

标签: python

编辑2:因为很多人都在反对这个用例可以揭示的糟糕设计。这些问题和答案的读者在使用之前应该三思而后

我试图在Python中用它的名字设置一个变量(不是属性):

foo = 'bar'
thefunctionimlookingfor('foo', 'baz')
print foot #should print baz

PS:通过名称(没有eval)访问变量的函数将是一个加号!

编辑:我知道字典存在,不鼓励使用这种用法,我选择将它用于非常特定的目的(根据环境修改配置文件),这将使我的代码更容易阅读。

5 个答案:

答案 0 :(得分:3)

在不使用exec的情况下,Python 2.x中无法在本地范围内动态设置变量,而在Python 3.x中根本不可能。您可以通过修改globals()返回的字典来更改全局范围,但实际上您不应该这样做。只需使用自己的字典即可。

答案 1 :(得分:3)

您可以执行以下操作:

def thefunctionimlookingfor(a, b):
    globals()[a] = b

用法:

>>> foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'q' is not defined
>>> thefunctionimlookingfor('foo', 'bar')
>>> foo
'bar'

但正如其他人所提到的,这是一个可怕的想法。命名空间是一个有用的概念。考虑重新设计。

答案 2 :(得分:1)

在模块级别,您可以在当前模块上使用setattr,您可以从sys.modules获取:

setattr(sys.modules[__name__], 'name', 'value')

答案 3 :(得分:0)

locals()函数返回一个填充了局部变量的字典。

locals()['foo'] = 'baz'

答案 4 :(得分:0)

你在寻找这样的功能吗?它们允许修改您碰巧所在的本地命名空间。

import sys

def get_var(name):
    return sys._getframe(1).f_locals[name]

def set_var(name, value):
    sys._getframe(1).f_locals[name] = value

def del_var(name):
    del sys._getframe(1).f_locals[name]