【问题标题】:Using a string variable as a variable name [duplicate]使用字符串变量作为变量名[重复]
【发布时间】:2012-07-18 05:13:05
【问题描述】:

可能重复:
How do I do variable variables in Python?

我有一个分配有字符串的变量,我想根据该字符串定义一个新变量。

foo = "bar"
foo = "something else"   

# What I actually want is:

bar = "something else"

【问题讨论】:

  • 你可能不想要那个。你为什么要这么做?
  • 不,你没有。您必须使用exec 的原因是因为locals() 不支持修改。 locals() 不支持修改,因为它会使实现变得更复杂和更慢,并且从来没有一个好主意
  • 我看到这篇文章试图找出如何使用字典为类分配实例变量。如果其他人有同样的问题,你可以在这里找到一个没有 exec 的干净解决方案:stackoverflow.com/questions/8187082/…

标签: python


【解决方案1】:

您可以为此使用exec

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

【讨论】:

  • +1 因为他回答了这个问题(尽管这个想法可能很糟糕)。
  • @mgalgs 为什么这是个坏主意?这个解决方案有什么不好的影响吗?提前致谢。
  • 注意使用exec / evalconsidered poor practice。我还没有遇到一个有用的用例,并且通常有更好的选择,例如dict
  • 为什么在 pytest 单元测试中使用时这不起作用?
  • +100 @jpp 所说的。尽管此答案有用且正确,但如果您编写的不是一次性脚本,则很可能使用dict
【解决方案2】:

使用字典会更快乐:

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

【讨论】:

  • 似乎没有解决问题。
  • 是的。这可能会有所帮助,但这不是 OP 所要求的。
  • 我很高兴看到答案还在。我认为我们可以相信 Stack Overflow 的读者会自行判断答案是否适合他们的需求。这个答案没有提供“变量”,这是真的。但我向你保证,99% 的人在寻找字典时会更开心。
  • 它不能直接回答这个问题,但是,人们可能会问这个问题,而忽略了他们可以使用字典来达到同样的目的
  • “我很冷,我怎么能放火烧我的房子?”
【解决方案3】:

你可以使用setattr

name  = 'varname'
value = 'something'

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

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

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

【讨论】:

  • 正确,它只适用于类。
  • 这个可以在Modules里面使用,所以设置一个module-level属性?例如。 MyModule.var
  • 回答我自己的问题,是的,它可以在模块内单独使用:stackoverflow.com/questions/2933470/…
猜你喜欢
  • 2020-11-01
  • 2020-06-15
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多