В большинсте случаев можно отказаться от использования изменяемых глобальных переменных. Такие переменные несут в себе больше проблем, чем пользы. Глобальная переменная в процессе выполнения программы может быть изменена неявно и будет получен неожиданный результат.


Пример 1

Лучше передавать total в функцию в качестве аргумента. Это гораздо более безопасный приём.

Плохо:


total = 0

def add(value):
    global total
    total += value

def subtract(value):
    global total
    total -= value

add(10)  # total = 10
subtract(5)  # total = 5

Хорошо:


def add(total, value):
    return total + value

def subtract(total, value):
    return total - value

total = 0
total = add(total, 10)  # total = 10
total = subtract(total, 5)  # total = 5


Пример 2

Вместо использования изменяемой глобальной переменной, можно хранить данные внутри объекта класса. Такое решение надёжнее и легко тестируется.

Плохо:


goods_basket = []

def add_product(product):
    global goods_basket
    goods_basket.append(product)

def clear_goods_basket():
    global goods_basket
    goods_basket.clear()

add_product('apple')  # goods_basket = ['apple']
add_product('orange')  # goods_basket = ['apple', 'orange']

clear_goods_basket()  # goods_basket = []

Хорошо:


class GoodsBasket:
    def __init__(self):
        self.basket = []

    def add(self, product):
        self.basket.append(product)

    def clear(self):
        self.basket.clear()

goods_basket = GoodsBasket()
goods_basket.add('apple')  # goods_basket = ['apple']
goods_basket.add('orange')  # goods_basket = ['apple', 'orange']

goods_basket.clear()  # goods_basket = []