Изменяемые глобальные переменные
Анти-паттерн
В большинсте случаев можно отказаться от использования изменяемых глобальных переменных. Такие переменные несут в себе больше проблем, чем пользы. Глобальная переменная в процессе выполнения программы может быть изменена неявно и будет получен неожиданный результат.
Пример 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 = []