Python中的子字符串变量名

3

我有几个变量像这样:

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个回答

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)

getattr()无法正常工作。它说参数有问题。可能是什么问题? - anonf34
@greg: 我怎么知道呢?你既没有告诉我你尝试了什么,也没有告诉我你得到了什么错误信息。 :) - Sven Marnach
我找出了问题所在。这是针对2.7版本的,而我正在使用3.2版本,它可以正常工作。谢谢并对我的弱评论道歉。 - anonf34
@greg:在2.7和3.2中使用getattr()没有区别。上面的代码应该在两个版本中都可以工作。 - Sven Marnach
我不知道当时出了什么问题,我复制了你的版本,但是出现了错误。重要的是我们解决了这个问题 ;) - anonf34

2
您可以使用getattr来实现这个功能: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)

我使用了以下代码:self.canvas.itemconfig(eval("self.lamp_{0}".format(i)), fill=self.color_blink)它正常工作!非常感谢! - anonf34
@greg:使用索引变量名是一个非常糟糕的想法。而使用eval()而不是getattr()来访问它们则更加糟糕。请不要忽视我们的建议,这样做对你自己有好处! :) - Sven Marnach

2

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

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

但是我同意:你应该使用列表(或字典)代替。 编辑:哦,而且使用setattr来设置它们:
setattr(self, 'lamp_%d' % i, value)

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接