Изменение имен переменных с помощью Python для циклов
Мне просто интересно, знал ли кто-нибудь об изменении имен переменных, основанных на цикле for, для чего-то вроде этого:
for i in range(3)
group+i=self.getGroup(selected, header+i)
чтобы имена переменных изменялись для размещения данных. Спасибо!
~ Сэм
Ответы
Ответ 1
Вероятно, вы хотите использовать dict вместо отдельных переменных. Например
d = {}
for i in range(3):
d["group" + str(i)] = self.getGroup(selected, header+i)
Если вы настаиваете на фактической модификации локальных переменных, вы можете использовать функцию locals
:
for i in range(3):
locals()["group"+str(i)] = self.getGroup(selected, header+i)
С другой стороны, если вы действительно хотите изменить переменные экземпляра класса, в котором вы находитесь, вы можете использовать функцию setattr
for i in group(3):
setattr(self, "group"+str(i), self.getGroup(selected, header+i)
И, конечно же, я предполагаю со всеми этими примерами, что вам не нужен только список:
groups = [self.getGroup(i,header+i) for i in range(3)]
Ответ 2
Используйте список.
groups = [0]*3
for i in xrange(3):
groups[i] = self.getGroup(selected, header + i)
или более "Pythonically":
groups = [self.getGroup(selected, header + i) for i in xrange(3)]
Для чего вы стоите, вы можете попытаться создать переменные "неправильным" способом, т.е. путем изменения словаря, который содержит их значения:
l = locals()
for i in xrange(3):
l['group' + str(i)] = self.getGroup(selected, header + i)
но это действительно плохая форма и, возможно, даже не гарантируется работа.
Ответ 3
Похоже, вы хотите использовать список:
group=[]
for i in range(3):
group[i]=self.getGroup(selected, header+i)
Ответ 4
Определенно следует использовать dict, используя ключ "group" + str (i), как описано в принятом решении, но я хотел бы поделиться решением с помощью exec. Его способ анализировать строки в командах и выполнять их динамически. Это позволит создавать эти имена скалярных переменных в соответствии с вашим требованием, а не использовать dict. Это может помочь в том, что не делать, и просто потому, что вы можете это не значит, что вам нужно. Хорошим решением для использования скалярных переменных является жесткое требование:
l = locals()
for i in xrange(3):
exec("group" + str(i) + "= self.getGroup(selected, header + i)")
Другой пример, где это может работать с использованием примера модели Django. Альтернативное решение exec комментируется, и лучший способ обработки такого случая с использованием атрибута dict имеет смысл:
Class A(models.Model):
....
def __getitem__(self, item): # a.__getitem__('id')
#exec("attrb = self." + item)
#return attrb
return self.__dict__[item]
Возможно, имеет смысл расширить словарь, прежде всего, чтобы получить функции setattr и getattr.
Ситуация, которая включает в себя синтаксический анализ, например, генерацию и выполнение команд python динамически, exec - это то, что вы хотите:) Подробнее о exec здесь.
Ответ 5
Вы можете получить доступ к атрибуту class __dict__
:
for i in range(3)
self.__dict__['group%d' % i]=self.getGroup(selected, header+i)
Но почему вы не можете использовать массив с именем group
?