Подтвердить что ты не робот

__main__ и scoping в python

Я был как-то удивлен следующим поведением:

def main():
    print "%s" % foo

if __name__ == "__main__":
    foo = "bar"
    main()

то есть. функция модуля имеет доступ к охватывающим переменным в __main__. Какое объяснение?

4b9b3361

Ответ 1

Переменные в глобальной области текущих модулей видны повсюду в модуле - это правило также выполняется для модуля __main__.

Из Учебник Guido:

В любое время во время выполнения есть как минимум три вложенных области действия, пространство имён которых доступно напрямую:

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

Ответ 2

foo - глобальная переменная модуля (она не входит в какую-либо функцию). Все области внутри модуля могут получить к нему доступ.

Ответ 3

Дело в том, что:

if __name__ == "__main__":
    foo = "bar"

определяет глобальную переменную с именем foo в script. поэтому любая функция этого модуля будет иметь к нему доступ.

Кусок кода, указанный выше, является глобальным для модуля, а не внутри любой функции.

Ответ 4

В python глобальная область и функции имеют свои собственные области. Таким образом, вы определяете foo при name== main, это в глобальной области. Кроме того, не ошибкой использовать переменную, которая еще не была объявлена, в функции, если она будет объявлена ​​к моменту вызова функции.