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