__main__ и обзор в python - PullRequest
       7

__main__ и обзор в python

27 голосов
/ 23 января 2011

Меня как-то удивило следующее поведение:

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

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

т.е. функция модуля имеет доступ к переменным в __main__. Чем это объясняется?

Ответы [ 4 ]

24 голосов
/ 23 января 2011

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

Из Учебник Гвидо :

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

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

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

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

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

Часть кода, перечисленная выше, является глобальной для модуля, а не внутри какой-либо функции.

6 голосов
/ 23 января 2011

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

2 голосов
/ 23 января 2011

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

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