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

→ Ссылка
Автор решения: Alex Krass

Можно обратиться к глобальном области видимости и зарезервировать там переменную. А дальше уже обращаться к ней из функции через глобальную область видимости.

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. Но вообще это странное извращение, ведь большинство задач решаются и без подобного кода. Достаточно использовать список или словарь.

→ Ссылка
Автор решения: insolor

Вместо кучи "нумерованных" переменных нужно использовать списки:

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]
→ Ссылка