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

Генерировать имена переменных на лету в 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 столбцов, типичное имя каждого столбца кажется очень большим. Итак, я задавался вопросом, есть ли способ генерировать эти имена столбцов на лету.

4b9b3361

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