Генерирование имен переменных на лету в python

Есть ли способ, которым я могу генерировать имена переменных в python в цикле и присваивать им значения? Например, если у меня есть

prices = [5, 12, 45]

я хочу

price1 = 5
price2 = 12
price3 = 45

Могу ли я сделать это в цикле или что-то вместо того, чтобы вручную назначать price1 = prices[0], price2 = prices[1] и т.п.

Спасибо.

РЕДАКТИРОВАТЬ

Многие люди предложили мне написать причину для этого. Во-первых, были времена, когда я думал, что это может быть более удобным, чем использование списка... Я точно не помню, когда, но я думаю, что думал об использовании этого, когда есть много уровней вложенности. Например, если у вас есть список списков списков, определение переменных описанным выше способом может помочь снизить уровень вложенности. Во-вторых, сегодня я думал об этом, когда пытался научиться использовать Pytables. Я только что натолкнулся на Pytables и увидел, что при определении структуры таблицы имена и типы столбцов описываются следующим образом:

class TableFormat(tables.IsDescription):
    firstColumnName = StringCol(16)
    secondColumnName = StringCol(16)
    thirdColumnName = StringCol(16)

Если у меня есть 100 столбцов, то ввод имени каждого столбца в явном виде кажется большой работой. Итак, я задался вопросом, есть ли способ генерировать эти имена столбцов на лету.

6 ответов

Если вы действительно хотите создавать их на лету, вы можете назначить dict, который возвращается либо globals(), либо locals() в зависимости от того, в каком пространстве имен вы хотите их создать:

globals()['somevar'] = 'someval'
print somevar  # prints 'someval'

Но я бы не рекомендовал это делать. В общем, избегайте глобальных переменных. Использование localals () часто просто скрывает то, что вы действительно делаете. Вместо этого создайте свой собственный dict и назначьте ему.

mydict = {}
mydict['somevar'] = 'someval'
print mydict['somevar']

Изучите питона дзен; запустите это и впитывайте это хорошо:

>>> import this

Хотя я не вижу особого смысла, вот оно:

for i in xrange(0, len(prices)):
    exec("price%d = %s" % (i + 1, repr(prices[i])));

На объекте вы можете достичь этого с setattr

>>> class A(object): pass
>>> a=A()
>>> setattr(a, "hello1", 5)
>>> a.hello1
5

Я получил вашу проблему, и вот мой ответ:

prices = [5, 12, 45]
list=['1','2','3']

for i in range(1,3):
  vars()["prices"+list[0]]=prices[0]
print ("prices[i]=" +prices[i])

Итак, при печати:

price1 = 5 
price2 = 12
price3 = 45

Другой пример, который на самом деле является вариацией другого ответа, в котором также используется словарь:

>>> vr={} 
... for num in range(1,4): 
...     vr[str(num)] = 5 + num
...     
>>> print vr["3"]
8
>>> 

Немного долго, это работает, я думаю...

prices = [5, 12, 45]
names = []
for i, _ in enumerate(prices):
    names.append("price"+str(i+1))
dict = {}
for name, price in zip(names, prices):
    dict[name] = price
for item in dict:
    print(item, "=", dict[item])
Другие вопросы по тегам