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