Генерирование имен переменных на лету в 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])