Почему оператор `global` не влияет на блоки внутри текущего блока? - PullRequest
0 голосов
/ 13 июня 2019
def foo():
    global a
    def bar():
        nonlocal a
        a = 6
    bar()

a = 5
foo()
print(a)

Попытка запустить модуль, состоящий из кода, указанного выше, приводит к SyntaxError: no binding for nonlocal 'a' found.Но я ожидал, что он запустится и напечатает 6, почему нет?

Обратите внимание, что если мы заменим оператор global a на оператор, связывающий имя a (например, from something import otherthing as a или a = 0), тогда не будет SyntaxError, а print(a)оператор выдает 5, как и ожидалось.

Я прочитал https://docs.python.org/3/reference/executionmodel.html#naming-and-binding, но не понял, что делают операторы global и nonlocal.

Ответы [ 2 ]

1 голос
/ 13 июня 2019

a ограничено в пространстве имен верхнего уровня.

Оператор nonlocal заставляет соответствующие имена ссылаться на ранее связанные переменные в ближайшей области действия включающей функции.

Но a не связан в области действия функции, поэтому

SyntaxError повышается во время компиляции

Другими словами global не влияетгде a связан.

0 голосов
/ 13 июня 2019
a = 5
def foo():
    global a
    def bar():
        global a
        a = 6
    bar()
foo()
print(a)

это печатает 6

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...