2012-02-09 116 views
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來刪除變量的名稱?

回答

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) 
+0

我用這樣的: 'self.canvas.itemconfig(EVAL( 「self.lamp_ {0}」 格式(I)。), 填充= self.color_blink)' 和它工作正常!非常感謝!! – greg 2012-02-09 15:13:25

+0

@greg:使用索引變量名稱是一個非常糟糕的主意。使用'eval()'而不是'getattr()'來訪問它們更糟糕。通過不忽視我們的建議來幫助自己! :) – 2012-02-09 15:55:51

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) 
+0

GETATTR()無法正常工作。據說這是有爭議的問題。那可能是什麼? – greg 2012-02-09 11:26:19

+0

@greg:我該怎麼知道?你既沒有告訴我你嘗試了什麼,也沒有告知你有什麼錯誤信息。 :) – 2012-02-09 11:39:45

+0

我找出問題所在。這是2.7版本,我使用3.2,它工作正常。謝謝並對弱評論感到抱歉。 – greg 2012-02-09 15:16:28

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) 
2

儘量避免使用eval只要有可能。在這種情況下,你可以使用getattr

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

但我同意:你應該使用,而不是一個列表(或字典)。

編輯:哦,並且使用setattr對其進行設置:

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