Почему нелокальный не создает новую внешнюю переменную (в отличие от глобальной) - PullRequest
0 голосов
/ 19 апреля 2020

Я заметил разницу между ключевыми словами global и nonlocal при чтении учебника Python 3 здесь .

Если я попробую следующий код, он будет работать :

# Does not need: spam = ''
def global_scope_test():
  def do_global():
    global spam
    spam = 'global spam'

  do_global()

global_scope_test()
print(spam)

Принимая во внимание следующее:

def nonlocal_scope_test():
  # Needs: spam = ''
  def do_nonlocal():
    nonlocal spam
    spam = 'nonlocal spam'

  do_nonlocal()
  print(spam)

nonlocal_scope_test()

Почему global разрешено создавать новые привязки в глобальной области, а nonlocal не разрешается создавать новые привязки во внешнем объеме? Это похоже на странную причуду, учитывая сходство двух функций. Учебное пособие не показало разницу в примере, и я не смог найти ни одной темы, говорящей об этом.

1 Ответ

3 голосов
/ 19 апреля 2020

В документации для нелокального об этом ясно сказано:

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

...