global можно несколькими способами:
  nonlocal (доступно в Python 3).Избежать использования global в Python для переменных, которые нужно изменять внутри функции, можно несколькими способами.  Использование global зачастую считается плохой практикой, так как делает код менее читаемым, сложнее в отладке и приводит к неявному изменению состояния, что может создавать неожиданные побочные эффекты. Вот основные альтернативы:
def my_function(x):
  x = x + 1
  return x
my_var = 5
my_var = my_function(my_var)
print(my_var)  # Output: 6
def modify_list(my_list):
  my_list.append(4)
  my_list[0] = 10
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # Output: [10, 2, 3, 4]
Важно помнить, что если переприсвоить аргументу новое значение внутри функции (например, my_list = [5, 6, 7]), это не повлияет на исходную переменную за пределами функции, так как это создаст новую локальную переменную.
class MyClass:
  def __init__(self, x):
    self.x = x
  def increment(self):
    self.x += 1
my_object = MyClass(5)
my_object.increment()
print(my_object.x)  # Output: 6
nonlocal.  Это делает переменную доступной для изменения из внутренней функции, но только в области видимости внешней функции, а не глобально.
      def outer_function():
  x = 5
  def inner_function():
    nonlocal x
    x += 1
  inner_function()
  print(x)  # Output: 6
outer_function()
dataclasses упрощают создание классов, которые в основном используются для хранения данных.  Они автоматически генерируют методы, такие как __init__, __repr__ и другие.  Использование dataclasses с mutable default values позволит изменять атрибуты экземпляра.
        from dataclasses import dataclass, field
@dataclass
class MyData:
    my_list: list = field(default_factory=list) # Используйте default_factory
    def add_item(self, item):
        self.my_list.append(item)
data = MyData()
data.add_item("hello")
print(data.my_list) # Output: ['hello']
Важно:  Следует избегать mutable default values (например, my_list: list = []) в dataclasses, так как это может привести к неожиданному поведению, когда все экземпляры класса будут использовать один и тот же список по умолчанию. Используйте field(default_factory=list) чтобы каждый экземпляр dataclass имел свой отдельный список.
def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment
counter = make_counter()
print(counter()) # Output: 1
print(counter()) # Output: 2
Выбор подходящего метода зависит от конкретной ситуации и структуры вашего кода. В большинстве случаев возврата значения или передачи изменяемых объектов будет достаточно. Использование классов предпочтительнее, когда нужно организовать состояние и поведение объекта. nonlocal полезен для работы с вложенными функциями, а замыкания для сохранения состояния между вызовами.