Генерировать имена переменных на лету в 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 столбцов, типичное имя каждого столбца кажется очень большим. Итак, я задавался вопросом, есть ли способ генерировать эти имена столбцов на лету.
Ответы
Ответ 1
Если вы действительно хотите создать их на лету, вы можете назначить dict, который возвращается либо globals(), либо locals() в зависимости от того, какое пространство имен вы хотите их создать:
globals()['somevar'] = 'someval'
print somevar # prints 'someval'
Но я бы не рекомендовал это делать. В общем, избегайте глобальных переменных. Использование locals() часто просто скрывает то, что вы на самом деле делаете. Вместо этого создайте свой собственный dict и назначьте его.
mydict = {}
mydict['somevar'] = 'someval'
print mydict['somevar']
Изучите python zen; запустите это и тщательно проверьте:
>>> import this
Ответ 2
Хотя я не вижу большого смысла, вот он:
for i in xrange(0, len(prices)):
exec("price%d = %s" % (i + 1, repr(prices[i])));
Ответ 3
На объекте вы можете достичь этого с помощью setattr
>>> class A(object): pass
>>> a=A()
>>> setattr(a, "hello1", 5)
>>> a.hello1
5
Ответ 4
У меня есть твоя проблема, и вот мой ответ:
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
Ответ 5
Другой пример, который действительно является вариацией другого ответа, заключается в том, что он также использует словарь:
>>> vr={}
... for num in range(1,4):
... vr[str(num)] = 5 + num
...
>>> print vr["3"]
8
>>>
Ответ 6
бит длинный, он работает, я думаю...
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])
Ответ 7
почему вы хотите поместить их в такие варны, вы хотите потреблять больше памяти:), почему бы не получить доступ к ним из списка цен [0], цены [1]....
но что, черт возьми, может это вам помочь?
price1, price2, price3 = prices