Подтвердить что ты не робот

Изменение имен переменных с помощью Python для циклов

Мне просто интересно, знал ли кто-нибудь об изменении имен переменных, основанных на цикле for, для чего-то вроде этого:

for i in range(3)
     group+i=self.getGroup(selected, header+i)

чтобы имена переменных изменялись для размещения данных. Спасибо!

~ Сэм

4b9b3361

Ответ 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?