Чисто формально без них нельзя обойтись. Всегда есть “buildins”. Любая непустая программа создает глобальные объекты.
Пример выше несколько неудачен. Он создает В пространстве имен текущего модуля 3 переменные f1,f2,data. Поэтому в таком случае надо создавать один объект data и не плодить бесполезные функции.
Задача заключается в том чтобы уменьшить число одновременно рассматриваемых объектов. Уменьшение достигается созданием части объектов внутри пространств имен, что исключает их рассмотрение в других местах (полностью или для этого требуется специальный синтаксис или интроспекция).
def f1(v1):
v2=1 # v2,v3 спрятаны внутри функции - самое надежное. Достать их снаружи проблематично, но тоже можно.
v3=2
return v1+v2+v3
class Tx:
__v1=3 # завернули переменную внутри класса, но при желании ее можно добыть
def __init__(self):
self.__v2=4 # засунули переменную в объект
# это тоже заворачивание переменной, но теперь в модуль. Доступ снаружи
# from mymodule import v1
v1=55