Python 使用字符串变量作为变量名

Python 使用字符串变量作为变量名,python,Python,可能重复: 我有一个分配了字符串的变量,我想基于该字符串定义一个新变量 foo = "bar" foo = "something else" # What I actually want is: bar = "something else" 您可以使用exec进行以下操作: >>> foo = "bar" >>> exec(foo + " = 'something else'") >>> print bar something

可能重复:

我有一个分配了字符串的变量,我想基于该字符串定义一个新变量

foo = "bar"
foo = "something else"   

# What I actually want is:

bar = "something else"

您可以使用
exec
进行以下操作:

>>> foo = "bar"
>>> exec(foo + " = 'something else'")
>>> print bar
something else
>>> 

你会更乐于使用字典:

my_data = {}
foo = "hello"
my_data[foo] = "goodbye"
assert my_data["hello"] == "goodbye"

您可以使用
setattr

name  = 'varname'
value = 'something'

setattr(self, name, value) #equivalent to: self.varname= 'something'

print (self.varname)
#will print 'something'

但是,由于您应该通知对象接收新变量,因此这只在类或模块内部起作用。

您可能不希望这样。你为什么要这么做?不,你没有。必须使用
exec
的原因是
locals()
不支持修改
locals()
不支持修改,因为它会使实现更复杂、更慢,而且从来都不是一个好主意类似的帖子:我在这篇帖子上尝试找到如何使用字典为类分配实例变量。如果其他人也有同样的问题,你可以在这里找到一个没有exec的干净解决方案:+1,因为他回答了这个问题(这可能是个坏主意)。@mgalgs为什么这是个坏主意?这个解决方案有什么不良影响吗?提前感谢。请注意,
exec
/
eval
的使用是不允许的。我还没有遇到过一个有用的用例,通常有更好的替代方案,比如
dict
。为什么在pytest单元测试中使用它不起作用?+100什么@jpp说的。虽然这个答案是有用且正确的,但如果您正在编写的不是一次性脚本,您很可能可以使用
dict
。它似乎并没有解决这个问题。是的。这可能会有帮助,但这不是OP所要求的。我很高兴看到答案还在这里。我认为我们可以相信堆栈溢出读者自己判断答案是否适合他们的需要。这个答案并没有提供“可变变量”,这是真的。但我向你保证99%的找字典的人会更乐意找到字典。这并不能直接回答这个问题,但是,人们可能会问这个问题,而忽视了他们可以使用字典来达到同样的目的“我很冷,我怎么能让我的房子着火?”对,它只在类内部工作。这可以在模块内部使用吗,所以设置一个模块级属性?例如,
MyModule.var
要回答我自己的问题,是的,它可以在模块内部单独使用: