Да, просто используйте выражение global
.
def func():
global var
var = "stuff"
Но имейте в виду, что назначение переменных функции, объявленной глобальной, только внедряет в пространство имен модуля. Вы не можете использовать эти переменные глобально после импорта:
from that_module import call_that_function
call_that_function()
print(use_var_declared_global)
, и вы получите
NameError: global name 'use_var_declared_global' is not defined
. Вы должны были бы сделать импорт снова, чтобы импортировать также эти новые «глобалы модуля». Встроенный модуль является «реальным глобальным», хотя:
class global_injector:
'''Inject into the *real global namespace*, i.e. "builtins" namespace or "__builtin__" for python2.
Assigning to variables declared global in a function, injects them only into the module's global namespace.
>>> Global= sys.modules['__builtin__'].__dict__
>>> #would need
>>> Global['aname'] = 'avalue'
>>> #With
>>> Global = global_injector()
>>> #one can do
>>> Global.bname = 'bvalue'
>>> #reading from it is simply
>>> bname
bvalue
'''
def __init__(self):
try:
self.__dict__['builtin'] = sys.modules['__builtin__'].__dict__
except KeyError:
self.__dict__['builtin'] = sys.modules['builtins'].__dict__
def __setattr__(self,name,value):
self.builtin[name] = value
Global = global_injector()
Я не думаю, что кто-то объяснил, как создать и установить глобальную переменную, имя которой само по себе является значением переменной.
Вот ответ, который мне не нравится, но, по крайней мере, он работает [1], обычно [2].
Я бы хотел, чтобы кто-нибудь показал мне лучший способ сделать это. Я нашел несколько вариантов использования, и я на самом деле использую этот уродливый ответ:
########################################
def insert_into_global_namespace(
new_global_name,
new_global_value = None,
):
executable_string = """
global %s
%s = %r
""" % (
new_global_name,
new_global_name, new_global_value,
)
exec executable_string ## suboptimal!
if __name__ == '__main__':
## create global variable foo with value 'bar':
insert_into_global_namespace(
'foo',
'bar',
)
print globals()[ 'foo']
########################################
Python exec следует избегать по многим причинам.
Примечание: обратите внимание на отсутствие ключевого слова «in» в строке «exec» («неквалифицированный exec»).