Область видимости
То, где вы создаёте переменную, определяет, где её можно использовать: только внутри этой области. Эта идея называется областью видимости.
Локальная область видимости
Когда вы создаёте переменную внутри функции, она находится в локальной области видимости этой функции и не может использоваться больше нигде.
Так, к x в примерах ниже нельзя обратиться снаружи функции, но любая функция, определённая внутри этой функции, всё же может её использовать.
Пример
Внутри функции, которая её создала, переменная работает как обычно:
Вывод: полная программа на Python
def myfunc():
x = 300
print(x)
myfunc()
Пример
Внутренняя функция может читать локальную переменную объемлющей функции:
Вывод: полная программа на Python
def myfunc():
x = 300
def myinnerfunc():
print(x)
myinnerfunc()
myfunc()
Глобальная область видимости
Создайте переменную в основной части кода Python, и она станет глобальной переменной, частью глобальной области видимости.
К глобальной переменной можно обратиться из любой области видимости, как глобальной, так и локальной.
Если использовать одно и то же имя и внутри, и снаружи функции, получатся две разные переменные. Та, что снаружи функции, находится в глобальной области видимости, а та, что внутри, в локальной.
Пример
Эта переменная создана вне какой-либо функции, поэтому она глобальная и её может использовать весь код:
Вывод: полная программа на Python
x = 300
def myfunc():
print(x)
myfunc()
print(x)
Пример
Сначала функция выводит свою локальную x, а затем основной код выводит глобальную:
Вывод: полная программа на Python
x = 300
def myfunc():
x = 200
print(x)
myfunc()
print(x)
Ключевое слово global
Вы находитесь в локальной области видимости, но вам нужно создать глобальную переменную? Именно это делает ключевое слово global.
Оно превращает переменную в глобальную.
Это ключевое слово нужно и тогда, когда функция должна изменить значение существующей глобальной переменной.
Пример
Благодаря global переменная x входит в глобальную область видимости:
global внутри функции, чтобы создать глобальную переменную x=300.
Выведите x вне функции.
Вывод: полная программа на Python
def myfunc():
global x
x = 300
myfunc()
print(x)
Пример
Объявление переменной с помощью global позволяет функции изменить её значение:
global внутри функции, чтобы изменить её значение на 200.
Выведите x после вызова функции.
Вывод: полная программа на Python
x = 300
def myfunc():
global x
x = 200
myfunc()
print(x)
Ключевое слово nonlocal
Вложенные функции используют ключевое слово nonlocal, чтобы работать с переменными окружающей их функции.
С ним переменная принадлежит внешней функции.
Пример
Из-за nonlocal здесь x — это переменная внешней функции:
nonlocal во вложенной функции, чтобы изменить переменную внешней функции.
Присвойте x="Jane" во внешней функции, измените значение на "hello" во внутренней и верните x.
Вывод: полная программа на Python
def myfunc1():
x = "Jane"
def myfunc2():
nonlocal x
x = "hello"
myfunc2()
return x
print(myfunc1())
Правило LEGB
Чтобы найти имя переменной, Python применяет правило LEGB и проверяет эти места по порядку:
- Local (локальная) — функция, которая выполняется прямо сейчас
- Enclosing (объемлющая) — все функции вокруг неё, от внутренней к внешней
- Global (глобальная) — верхний уровень модуля
- Built-in (встроенная) — пространство имён с именами, встроенными в Python
Пример
Правило LEGB в действии:
Вывод: полная программа на Python
x = "global"
def outer():
x = "enclosing"
def inner():
x = "local"
print("Внутренняя функция:", x)
inner()
print("Внешняя функция:", x)
outer()
print("Глобальная область:", x)