编辑2:因为很多人都在反对这个用例可以揭示的糟糕设计。这些问题和答案的读者在使用之前应该三思而后
我试图在Python中用它的名字设置一个变量(不是属性):
foo = 'bar'
thefunctionimlookingfor('foo', 'baz')
print foot #should print baz
PS:通过名称(没有eval)访问变量的函数将是一个加号!
编辑:我知道字典存在,不鼓励使用这种用法,我选择将它用于非常特定的目的(根据环境修改配置文件),这将使我的代码更容易阅读。答案 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]