Из прочтения документации я понимаю, что в Python есть отдельное пространство имен для функций, и если я хочу использовать глобальную переменную в этой функции, мне нужно ее использовать global
.
Я использую Python 2.7, и я попробовал этот маленький тест
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
Кажется, все работает нормально, даже без global
. Я смог получить доступ к глобальной переменной без каких-либо проблем.
Я что-то упустил? Кроме того, следующее из документации по Python:
Имена, перечисленные в глобальном операторе, не должны быть определены как формальные параметры или как цель управления циклом for, определение класса, определение функции или оператор импорта.
В то время как формальные параметры и определение класса имеют смысл для меня, я не могу понять ограничение для цели управления циклом и определения функции.
def foo(): ...
иfoo = ...
в то же время). Это создает новую область для каждого вызова функции. (Но как это отличается от всех других языков высокого уровня в мире?)Ответы:
Ключевое слово
global
полезно только для изменения или создания глобальных переменных в локальном контексте, хотя создание глобальных переменных редко считается хорошим решением.Вышеуказанное даст вам:
Если вы используете
global
оператор, переменная станет доступной «вне» области действия функции, фактически превратившись в глобальную переменную.Таким образом, приведенный выше код даст вам:
Кроме того, из-за природы Python, вы также можете использовать
global
для объявления функций, классов или других объектов в локальном контексте. Хотя я бы посоветовал против этого, так как это вызывает кошмары, если что-то идет не так или требует отладки.источник
globals
автоматически определяемый во всех пространствах имен (к счастью). Как вы правильно указали, глобал связан с пространством имен в модуле, однако он может быть импортирован в другой модуль какfrom module import variable
илиimport module.variable
. В первом случае импорт сделает переменную доступной какvariable
без ссылки наmodule.
. Если он считается глобальным в объеме модуля будет зависеть от того, где он импортируется. Смотрите такжеnonlocal
как новое ключевое слово, связанное с областью видимости в Python 3.Хотя вы можете получить доступ к глобальным переменным без
global
ключевого слова, если вы хотите изменить их, вы должны использоватьglobal
ключевое слово. Например:В вашем случае вы просто получаете доступ к списку
sub
.источник
foo = 3
без глобальных работ, но foo снова определяется локально вblub
области действия функции и не изменяет исходную переменную foo. Это было довольно запутанным для меня.В этом разница между доступом к имени и привязке его в области видимости.
Если вы просто ищете переменную, чтобы прочитать ее значение, вы получите доступ к глобальной и локальной области видимости.
Однако если вы присваиваете переменную, имя которой не входит в локальную область, вы привязываете это имя к этой области (и если это имя также существует как глобальное, вы его скрываете).
Если вы хотите иметь возможность присваивать глобальное имя, вам нужно указать парсеру использовать глобальное имя, а не связывать новое локальное имя - это то, что делает ключевое слово «global».
Привязка в любом месте блока приводит к тому, что имя в этом блоке становится связанным, что может вызвать некоторые довольно странные последствия (например, UnboundLocalError, внезапно появляющийся в ранее работающем коде).
источник
Другие ответы отвечают на ваш вопрос. Еще одна важная вещь, которую нужно знать об именах в Python, это то, что они являются локальными или глобальными для каждой области действия.
Рассмотрим это, например:
Вы, вероятно, можете догадаться, что
value = 0
оператор будет присваивать локальную переменную и не повлияет на значение той же переменной, объявленной внеdoit()
функции. Вы можете быть более удивлены, обнаружив, что приведенный выше код не будет работать. Заявлениеprint value
внутри функции производитUnboundLocalError.
Причина в том, что Python заметил, что в другом месте функции вы присваиваете имя
value
, а такжеvalue
нигде не объявляетсяglobal
. Это делает его локальной переменной. Но когда вы пытаетесь распечатать его, локальное имя еще не определено. В этом случае Python не прибегает к поиску имени как глобальной переменной, как это делают некоторые другие языки. По сути, вы не можете получить доступ к глобальной переменной, если вы определили локальную переменную с тем же именем в любом месте функции.источник
global
(илиnonlocal
в Python 3.x) отменяет это поведение и позволяет переназначить внешнее имя.let
, не поднимаются.global
или это не имеет значения?Доступ к имени и присвоение имени отличаются. В вашем случае вы просто получаете доступ к имени.
Если вы присваиваете переменную внутри функции, эта переменная считается локальной, если вы не объявили ее глобальной. В отсутствие этого он считается глобальным.
источник
global
Пример:
источник
Предполагается, что любая переменная, объявленная вне функции, является глобальной, и только если вы объявляете их изнутри функций (кроме конструкторов), вы должны указать, что эта переменная будет глобальной.
источник
Это хорошо объясняется в FAQ по Python
https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
источник
Это означает, что вы не должны делать следующее:
источник
Глобал делает переменную "Глобал"
Это заставляет 'x' действовать как обычная переменная вне функции. Если вы вынули глобальную переменную, это выдаст ошибку, поскольку она не может распечатать переменную внутри функции.
источник