1

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

我试图通过它在 Python 中的名称来设置一个变量(不是属性):

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

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

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

4

6 回答 6

5

当你想要变量命名的变量时,是时候使用字典了:

data = {}
foo = 'bar'
data[foo] = 'baz'
print data['bar']
于 2012-07-27T12:34:43.533 回答
3

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

于 2012-07-27T12:34:14.697 回答
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'

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

于 2012-07-27T12:47:51.143 回答
1

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

setattr(sys.modules[__name__], 'name', 'value')
于 2012-07-27T13:19:31.473 回答
0

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

locals()['foo'] = 'baz'
于 2012-07-27T12:35:56.160 回答
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]
于 2012-07-27T15:26:59.737 回答