Глобализация всех переменных в Python
Допустим, что у меня есть много переменных, которые создаются циклом:
for i in range(1,6):
exec('variable' + str(i) + '= i')
exec('print(variable%s)' %str(i))
Затем, мне понадобилась 3 переменная:
print(variable3)
Вывод программы:
1
2
3
4
5
3
Логично.
Затем мне понадобилось цикл заключить в функцию:
def variables():
for i in range(1,6):
exec('variable' + str(i) + '= i')
exec('print(variable%s)' %str(i))
И снова вывести третью переменную, но на сей раз, выходит ошибка:
Traceback (most recent call last):
print(variable3)
NameError: name 'variable3' is not defined
global? А если мне потребуется список с перечислением переменных? Делать так?
global variable1
global variable2
global variable3
...
Нет, глупо.
global * (Что, по моему, логично) не работает!
Как исправить проблему?
Ответы (3 шт):
Если вам нужна возможность получать данные из глобальной области, можно перенести их в локальную:
def a():
# дополняем локальную область видимости
locals().update({
var:globals()[var] # помещаем в неё пару название_переменной:значение
for var in globals() # которые берутся из глобальной области
if var.startswith('variable') # если название переменной начинается с variable
})
Если же речь идёт именно о механике объявления переменной как глобальной (чтобы при изменении её в функции она менялась в глобальной области видимости), вам придётся каждую переменную объявлять глобальной (exec тут не помощник, насколько мне известно)
А вообще это довольно посредственный подход к работе с данными, от которого лучше отказаться. 6 различных переменных в большинстве случаев можно заменить списком. Мне трудно представить ситуацию, в которой такой подход к работе с данными будет предпочтительным.
Можно обратиться к глобальном области видимости и зарезервировать там переменную. А дальше уже обращаться к ней из функции через глобальную область видимости.
def variables():
for i in range(1,6):
globals()['variable' + str(i)] = None;
exec('variable' + str(i) + ' = ' + str(i), globals())
exec('print(variable%s)' % str(i), globals())
variables()
print(variable3)
P.S. Но вообще это странное извращение, ведь большинство задач решаются и без подобного кода. Достаточно использовать список или словарь.
Вместо кучи "нумерованных" переменных нужно использовать списки:
vars = []
for i in range(0,6):
vars.append(i) # добавить число в конец списка
print(var[i]) # вывести значение по индексу
print(var[-1]) # или вывести последнее значение в списке
Внутри функции:
def variables():
vars = []
for i in range(1,6):
vars.append(i)
return vars
print(variables()) # Выведет [1,2,3,4,5]