В чем разница между нелокальной и глобальной переменной?

Я изучаю концепции языков программирования.

Я нашел терминологию "нелокальный" в синтаксисе Python.

Что означает нелокальный в питоне??

5 ответов

Нелокальные переменные представлены во вложенном цикле. Используется ключевое слово nonlocal и берется значение из ближайшего включающего цикла. Пример такой:-

def outer():
    x = "local"

    def inner():
        nonlocal x
        x = "nonlocal"
        print("inner:", x)

    inner()
    print("outer:", x)

Результат будет "нелокальным" оба раза, поскольку значение x было изменено внутренней функцией.

«нелокальная» означает, что переменная не является «ни локальной, ни глобальной», т. е. переменная из объемлющего пространства имен (обычно из внешней функции вложенной функции).

Важное различие между нелокальной и глобальной переменными заключается в том, что нелокальная переменная должна быть уже связана во включающем пространстве имен (иначе будет вызвана ошибка синтаксиса), в то время как глобальное объявление в локальной области не требует, чтобы переменная была предварительно привязана (она будет создать новую привязку в глобальном пространстве имен, если переменная не привязана заранее).

nonlocal fooin может получить доступ к нелокальной переменной foo = 10in, но не нелокальная переменная in или глобальная переменная снаружи, как показано ниже:

      foo = 0 # <- ✖
def outer():
    foo = 5 # <- ✖
    def middle():
        foo = 10 # <- 〇
        def inner():
            nonlocal foo # Here
            foo += 1
            print(foo) # 11
        inner()
    middle()
outer()

global fooвinner()может получить доступ к глобальной переменной foo = 0внешняя, но не нелокальная переменная foo = 5вouter()иmiddle()как показано ниже:

      foo = 0 # <- 〇
def outer():
    foo = 5 # <- ✖
    def middle():
        foo = 10 # <- ✖
        def inner():
            global foo # Here
            foo += 1
            print(foo) # 1
        inner()
    middle()
outer()

Нелокальный оператор заставляет перечисленные идентификаторы ссылаться на ранее связанные переменные в ближайшей охватывающей области. Это важно, потому что поведение по умолчанию для привязки - сначала искать в локальном пространстве имен. Оператор позволяет инкапсулированному коду связывать переменные вне локальной области, кроме глобальной (модульной) области.

Имена, перечисленные в нелокальном операторе, в отличие от имен, перечисленных в глобальном операторе, должны ссылаться на ранее существовавшие привязки в охватывающей области (область, в которой должна быть создана новая привязка, не может быть определена однозначно).

Имена, перечисленные в нелокальном выражении, не должны вступать в противоречие с существующими ранее привязками в локальной области видимости.

      global x

def outer():

    x="global"

    def inner():
        nonlocal x
        x="nonlocal"

    def inner2():
        x="local"

inner2()

print(x)

inner()

print(x)

outer()
      
Output:

global

nonlocal
Другие вопросы по тегам