如何在Python中通过变量名设置变量?

如何在Python中通过变量名设置变量?,python,Python,编辑2:由于如此多的人对糟糕的设计大声疾呼,这个用例可以揭示这一点。阅读这些问答的读者在使用前应该三思 我试图在Python中通过名称设置变量(而不是属性): foo = 'bar' thefunctionimlookingfor('foo', 'baz') print foot #should print baz PS:通过名称(不带eval)访问变量的函数将是一个加号 编辑:我知道字典是存在的,不鼓励这种用法,我选择将它用于非常特定的目的(根据环境修改配置文件),这将使我的代码更易于阅读。

编辑2:由于如此多的人对糟糕的设计大声疾呼,这个用例可以揭示这一点。阅读这些问答的读者在使用前应该三思

我试图在Python中通过名称设置变量(而不是属性):

foo = 'bar'
thefunctionimlookingfor('foo', 'baz')
print foot #should print baz
PS:通过名称(不带eval)访问变量的函数将是一个加号


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

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

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

当您需要可变名称的变量时,是时候使用字典了:

data = {}
foo = 'bar'
data[foo] = 'baz'
print data['bar']

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

data = {}
foo = 'bar'
data[foo] = 'baz'
print data['bar']
locals()
函数返回一个包含局部变量的字典

locals()['foo'] = 'baz'
locals()
函数返回一个包含局部变量的字典

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

您可以执行以下操作:

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'
>>foo
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“q”
>>>函数imlookingfor('foo','bar')
>>>福
“酒吧”

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

< P>你可以这样做:

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'
>>foo
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“q”
>>>函数imlookingfor('foo','bar')
>>>福
“酒吧”

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

在模块级,您可以在当前模块上使用<代码> SETATAF/<代码>,您可以从<代码> sys >模块<代码>:< /P>

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

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

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

您正在寻找这样的函数吗?它们允许修改您碰巧所在的本地名称空间

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]

您正在寻找这样的函数吗?它们允许修改您碰巧所在的本地名称空间

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]

你可能想看看你可能想看看这不是我的问题,我的问题是如何设置局部变量,没有如何解决这个问题need@AsTeR:那么你应该接受另一个答案。此外,你应该停止尝试这样做。字典是用来解决这个问题的。我知道字典是存在的,我也知道我应该接受答案,所以如果有适合我的问题的话。我也知道我在做什么,谢谢关心(问题的编辑解释了这一点)@阿斯特:请阅读奈德的博客文章(特别是讨论)。请考虑您在这个问题上出错的可能性。@ ASTER:在这种情况下,我建议使<代码> CONFIG/<代码>自定义类的一个实例,并使用<代码> StAdTracle()/<代码>和<代码> GATTAL()/<代码>。动态命名的属性有它们的用例,但动态命名的变量没有。(这似乎是XY问题的一个例子:你没有问你的实际问题,而是问你试图解决的问题。)这不是我的问题,我的问题是如何设置局部变量,而不是如何解决这个问题need@AsTeR:那么你应该接受另一个答案。此外,你应该停止尝试这样做。字典是用来解决这个问题的。我知道字典是存在的,我也知道我应该接受答案,所以如果有适合我的问题的话。我也知道我在做什么,谢谢关心(问题的编辑解释了这一点)@阿斯特:请阅读奈德的博客文章(特别是讨论)。请考虑您在这个问题上出错的可能性。@ ASTER:在这种情况下,我建议使<代码> CONFIG/<代码>自定义类的一个实例,并使用<代码> StAdTracle()/<代码>和<代码> GATTAL()/<代码>。动态命名的属性有它们的用例,但动态命名的变量没有。(这似乎是XY问题的一个例子:您没有询问实际问题,而是询问尝试的解决方案。)这实际上不在函数内部工作,但在函数外部工作works@AsTeR:那么您应该使用
globals()
而不是
locals()
locals()
的文档说明,不能修改返回的字典。这实际上不在函数内部工作,但在函数外部工作works@AsTeR:那么您应该使用
globals()
而不是
locals()
locals()
的文档说明,返回的字典不能修改。+1关于详细代码,我接受斯文的答案,因为这是第一个+1对于详细的代码,我第一个接受了斯文的答案!