Используйте итератор в качестве имени переменной в цикле Python - PullRequest
4 голосов
/ 16 декабря 2011

Мне было интересно, есть ли способ использовать итератор в качестве имени переменной в цикле Python. Например, если я хотел создать объекты v0, v1, v2, есть ли способ сделать что-то вроде этого:

for i in range(3):
    v + str(i) = i**2

Я знаю, что синтаксис неправильный, но идея должна быть ясной. Что-то эквивалентное paste в R? Большое спасибо,

Ответы [ 4 ]

7 голосов
/ 16 декабря 2011

Встроенный метод globals () возвращает словарь, представляющий текущую таблицу глобальных символов.

Вы можете добавить переменную к globals следующим образом:

globals()["v" + str(i)] = i**2

К вашему сведению : Это ответ на ваш вопрос, но, конечно, не рекомендуемый путь.Непосредственное манипулирование globals - это хакерское решение, которого в большинстве случаев можно избежать, будучи более чистой альтернативой.( Смотрите другие комментарии в этой теме )

5 голосов
/ 16 декабря 2011

Хотя это и не пытается ответить на вопрос напрямую (см. Ответ geccos за это), обычно это «одобренный» метод для такой операции:

v = [i**2 for i in range(3)]

print v[0] # 0
print v[1] # 1
print v[2] # 4

Как правило, использование ADT (в данном случае списка) для представления данной проблемы является более понятным и расширяемым, чем создание «динамических переменных» или «переменных переменных».

Удачного кодирования.


В то время как вышеупомянутые используют индексы, более общая форма "переменных переменных" обычно делается со словарем:

names = dict(("v" + str(i), i**2) for i in range(3))
print names["v2"] # 4

И, для фиксированного конечного (и относительно небольшого) набора переменных, «распаковка» также может быть использована:

v0, v1, v2 = [i**2 for i in range(3)]
print v1 # 1
1 голос
/ 19 января 2015

Есть несколько способов сделать это, лучший из которых будет зависеть от того, что вы на самом деле хотите делать с переменными после их создания.

globals() и locals() будут работать, но это не то, что вы хотите. exec() также будет работать, но это даже хуже, чем globals() и locals().

Понимание списка, упомянутое @ user166390, является хорошей идеей, если v1, v2 и v3 однородны, и вы просто хотите получить к ним доступ по индексу.

>>> v = [i ** 2 for i in range(3)]
>>> v[0]
0
>>> v[1]
1
>>> v[2]
4

Вы также можете сделать это, если это всегда ровно три элемента:

>>> v1, v2, v3 = [i ** 2 for i in range(3)]
>>> v1
0
>>> v2
1
>>> v3
2

Это хорошо, если объекты более индивидуальны, потому что вы можете дать им свои собственные имена.

Другим промежуточным вариантом является использование dict:

d = {}
for i, val in enumerate(range(3)):
    d["v{}".format(i)] = val

>>> d["v0"]
0
>>> d["v1"]
1
>>> d["v2"]
4

Или ярлык для вышеперечисленного с использованием словосочетания:

d = {"v{}".format(i): val for i, val in enumerate(range(3))}
1 голос
/ 16 декабря 2011

Я предпочитаю xrange () диапазону ().Вот код для вас:

for i in xrange(3):
    exec("v"+str(i)+" = i * i")

Даже если ... вам следует рассмотреть возможность использования списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...