Python: заполнить список именами переменных?

#python #arrays #numpy

#питон #массивы #тупица

Вопрос:

Просто скажите, что у меня много переменных с последовательностью имен var1 , var2 , varn ? … например:

 var1 = 1 var2 = 2 var3 = 3 var4 = 4  

Я хотел бы заполнить список этими именами переменных. Я пытался сделать это так, но это не сработало:

 def namestr(obj, namespace):  return [name for name in namespace if namespace[name] is obj] variables = [] for i in range(1,5):  variables.append(namestr(vars()['semplus'   str(i)], globals()))  

кто-нибудь знает, как это сделать? результат должен быть таким:

 [var1, var2, var3, var4]  

Комментарии:

1. Я бы вмешался после первого предложения и задал вопрос, почему вы вообще назвали переменные таким образом?! Почему бы вместо этого не составить список?

2. Похоже, здесь более уместно использовать диктант.

3. Для этого вы должны использовать структуру данных в качестве словаря вместо переменных. Но просто для протокола, то. locals() вызов вернет то, что вы ожидаете, как namespace в вашем примере.

4. @deceze что не так с именованными переменными?

5. Именно с этой проблемой вы сейчас сталкиваетесь: вы не можете обрабатывать их в совокупности, и имена на самом деле не добавляют ничего ценного. var[1] , var[2] было бы практически то же самое, но также легко обрабатывается в целом.

Ответ №1:

Лучше всего это делать со словарем:

 In [1]: d = {}   In [2]: for i in range(1,5):   ...: d[f"var{i}"] = i   ...:   In [3]: d["var1"]  Out[3]: 1  In [4]: d.keys()  Out[4]: dict_keys(['var1', 'var2', 'var3', 'var4'])   

Ответ №2:

С вашими var# определениями в рабочей области, которую я использовал для других тестов:

 In [330]: def namestr(obj, namespace):  ...: return [name for name in namespace if namespace[name] is obj]  ...: variables = []  ...: for i in range(1,5):  ...: variables.append(namestr(vars()['var'   str(i)], globals()))  ...:   ...:  In [331]: variables Out[331]: [['i', 'var1'], ['i', 'j', 'var2'], ['dim', 'i', 'var3'], ['i', 'var4']]  

Что здесь происходит? var2 имеет значение 2. Так же j , как и при предыдущем использовании. И i является текущей переменной итерации.

 In [332]: var1 Out[332]: 1 In [333]: var3 Out[333]: 3 In [334]: dim # a prior use of this variable Out[334]: 3 In [335]: i Out[335]: 4 In [336]: j Out[336]: 2  

Таким образом , вы получаете имена переменных со значениями, соответствующими соответствующим var1 переменным и var2 т. Д.