substring变量名python

时间:2012-02-09 11:02:41

标签: python variables eval

我的变数很少这样:

self.lamp_1
self.lamp_2
self.lamp_3
self.lamp_4

现在我想使用每个名称循环来自动调用它们,如下所示:

for i in range(1,5):
    self.canvas.itemconfig(self.lamp_/number_i_automaticly/, fill=self.color_blink)

我尝试使用函数eval()但它不起作用。它停止运行我的程序。

eval("self.canvas.itemconfig(self.lamp_"+str(i)+",fill=self.color_blink)")

如何使用密钥i?

以这种方式解析变量名称

4 个答案:

答案 0 :(得分:8)

使用列表而不是索引变量名称:

self.lamps = [lamp_1, lamp_2, lamp_3, lamp_4]

如果您坚持使用索引变量名称(不应该),则可以使用getattr()

for i in range(1, 5):
    self.canvas.itemconfig(getattr(self, "lamp_%i" % i), 
                           fill=self.color_blink)

答案 1 :(得分:2)

可以使用getattr

for i in range(1,5):
    self.canvas.itemconfig(getattr(self, 'lamp_%s' % i),
                           fill=self.color_blink)

但你真的不应该像这样命名你的变量。将它们放在一个列表中并迭代:

self.lamps = [self.lamp_1, self.lamp_2, self.lamp_3, self.lamp_4]
for lamp in self.lamps:
    self.canvas.itemconfig(lamp, fill=self.color_blink)

答案 2 :(得分:2)

尽可能避免使用eval。在这种情况下,您可以使用getattr

for i in range(1, 5):
    value = getattr(self, 'lamp_%d' % i)

但我同意:你应该使用列表(或字典)。

编辑:哦,并使用setattr进行设置:

setattr(self, 'lamp_%d' % i, value)

答案 3 :(得分:1)

我建议按照@SvenMarnach的建议这样做。但是,如果必须用于某些外部原因lamp_1等,则应将循环从range()更改为:

for lamp in (self.lamp_1, self.lamp_2, self.lamp_3, self.lamp_4):
    self.canvas.itemconfig(lamp, fill=self.color_blink)