В любое время во время выполнения есть как минимум три вложенных области действия, пространство имён которых доступно напрямую:
самая внутренняя область поиска, в которой выполняется поиск, содержит локальные имена
области любых закрывающих функций, поиск которых начинается с ближайшего охватывающая область, содержит нелокальные, но также и неглобальные имена
следующая последняя область содержит текущие глобальные имена модулей
самая внешняя область (поиск последней) - это пространство имен, содержащее встроенные имена
Ответ 2
foo - глобальная переменная модуля (она не входит в какую-либо функцию). Все области внутри модуля могут получить к нему доступ.
Ответ 3
Дело в том, что:
if __name__ == "__main__":
foo = "bar"
определяет глобальную переменную с именем foo в script. поэтому любая функция этого модуля будет иметь к нему доступ.
Кусок кода, указанный выше, является глобальным для модуля, а не внутри любой функции.
Ответ 4
В python глобальная область и функции имеют свои собственные области. Таким образом, вы определяете foo при name== main, это в глобальной области. Кроме того, не ошибкой использовать переменную, которая еще не была объявлена, в функции, если она будет объявлена к моменту вызова функции.