我有几个这样的变量:
self.lamp_1
self.lamp_2
self.lamp_3
self.lamp_4
现在我想使用每个名称is循环自动调用它们,如下所示:
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以这种方式对变量名称进行分类?
使用列表而不是索引变量名:
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)
您可以为此使用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)
尽可能避免使用eval。在这种情况下,您可以使用getattr
:
for i in range(1, 5):
value = getattr(self, 'lamp_%d' % i)
但我同意:你应该使用列表(或字典)。
编辑:哦,并使用setattr
设置它们:
setattr(self, 'lamp_%d' % i, value)
我建议按照@SvenManach的建议来做。但是,如果由于某些外部原因必须使用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)