Если я создаю глобальную переменную в одной функции, как я могу использовать эту переменную в другой функции?
Мы можем создать глобал с помощью следующей функции:
def create_global_variable():
global global_variable # must declare it to be a global first
# modifications are thus reflected on the module's global scope
global_variable = 'Foo'
Написание функции фактически не запускает ее код. Итак, мы вызываем create_global_variable
функцию:
>>> create_global_variable()
Использование глобалов без изменений
Вы можете просто использовать его, если вы не собираетесь изменять, на какой объект он указывает:
Например,
def use_global_variable():
return global_variable + '!!!'
и теперь мы можем использовать глобальную переменную:
>>> use_global_variable()
'Foo!!!'
Модификация глобальной переменной изнутри функции
Чтобы указать глобальную переменную на другой объект, необходимо снова использовать ключевое слово global:
def change_global_variable():
global global_variable
global_variable = 'Bar'
Обратите внимание, что после написания этой функции код, фактически изменяющий ее, все еще не выполняется:
>>> use_global_variable()
'Foo!!!'
Итак, после вызова функции:
>>> change_global_variable()
мы можем видеть, что глобальная переменная была изменена. global_variable
Имя теперь указывает на 'Bar'
:
>>> use_global_variable()
'Bar!!!'
Обратите внимание, что «глобальный» в Python не является действительно глобальным - он только глобален для уровня модуля. Так что он доступен только для функций, написанных в модулях, в которых он является глобальным. Функции запоминают модуль, в котором они написаны, поэтому, когда они экспортируются в другие модули, они все равно ищут модуль, в котором они были созданы, чтобы найти глобальные переменные.
Локальные переменные с тем же именем
Если вы создадите локальную переменную с тем же именем, она заменит глобальную переменную:
def use_local_with_same_name_as_global():
# bad name for a local variable, though.
global_variable = 'Baz'
return global_variable + '!!!'
>>> use_local_with_same_name_as_global()
'Baz!!!'
Но использование этой неправильно названной локальной переменной не меняет глобальную переменную:
>>> use_global_variable()
'Bar!!!'
Обратите внимание, что вам следует избегать использования локальных переменных с такими же именами, как у глобальных, если вы точно не знаете, что делаете, и у вас есть веская причина для этого. Я еще не сталкивался с такой причиной.
Мы получаем то же самое поведение в классах
Последующий комментарий комментирует:
Что делать, если я хочу создать глобальную переменную внутри функции внутри класса и использовать эту переменную внутри другой функции внутри другого класса?
Здесь я демонстрирую, что мы получаем то же поведение в методах, что и в обычных функциях:
class Foo:
def foo(self):
global global_variable
global_variable = 'Foo'
class Bar:
def bar(self):
return global_variable + '!!!'
Foo().foo()
И сейчас:
>>> Bar().bar()
'Foo!!!'
Но я бы предложил вместо использования глобальных переменных использовать атрибуты класса, чтобы не загромождать пространство имен модуля. Также обратите внимание, что self
здесь мы не используем аргументы - это могут быть методы класса (удобно, если мутирует атрибут класса из обычного cls
аргумента) или статические методы (нет self
или cls
).