Присвоение значений переменным в списке с помощью цикла - PullRequest
9 голосов
/ 14 января 2011
var_list = [one, two, three]
num = 1
for var in var_list:
    var = num
    num += 1

Вышесказанное дает мне ошибку, что «один» не существует. Вы не можете назначить таким образом? Я хочу назначить инкрементный номер для каждой переменной в списке.

Ответы [ 5 ]

12 голосов
/ 14 января 2011

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

>>> var_names = ["one", "two", "three"]
>>> count = 1
>>> for name in var_names:
...  globals()[name] = count
...  count += 1
... 
>>> one
1
>>> two
2
>>> three
3
>>> globals()[raw_input()] = 42
answer
>>> answer
42

Рекомендуемое чтение

8 голосов
/ 14 января 2011

Переменные Python - это имена для значений. Они на самом деле не «содержат» значения.

for var in var_list: заставляет 'var' становиться именем для каждого элемента списка, в свою очередь. Внутри цикла var = num не влияет на список: вместо этого var перестает быть именем для элемента списка, а вместо этого начинает называться именем для num имен, которые в данный момент указаны.

Точно так же, когда вы создаете список, если one, two и three еще не являются именами для значений, вы не можете использовать их таким образом, потому что вы просите создать список значения, которые имеют эти имена (а затем var_list будет именем для этого списка). Обратите внимание, что список на самом деле также не содержит значений: он ссылается, т.е. разделяет их.

4 голосов
/ 14 января 2011

Нет, так не работает.

Вы можете попробовать:

one, two, three = range(1, 4)

Эта работа путем определения переменных в множественном присваивании. Так же, как вы можете использовать a, b = 1, 2. Это развернет range и присвоит его значения переменным LHS, чтобы он выглядел как ваш цикл (за исключением того, что он работает).

Другой вариант (который я бы не рекомендовал в реальной программе ...) - ввести имена переменных в операторе exec:

names = ['one', 'two', 'three']
num = 1
for name in names:
    exec "%s = %s" % (name, num)
    num += 1
print one, two, three                  
3 голосов
/ 14 января 2011

Переменная не существует, пока вы ее не создадите.Простая ссылка на переменную не достаточно для ее создания.Когда вы делаете [one, two, three], вы ссылаетесь на переменные one, two и three до их создания.

0 голосов
/ 30 сентября 2018

Я думаю, что этот подход проще.

var_list = [1, 2, 3]
num = 1
for index,var in enumerate(var_list):
    var_list[index] = num
    num += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...