> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/pochemu-globalnye-peremennye-eto-plokho.md).

# Почему глобальные переменные это плохо?

Глобальные переменные считаются **плохой практикой** почти во всех проектах (включая автотесты) по нескольким причинам:

***

### **1. Нарушение принципа&#x20;*****Single Responsibility***

* Функция или класс начинают зависеть от внешнего состояния, которое не очевидно из их параметров.
* Код сложнее понять, потому что поведение меняется неявно.

**Пример:**

```python
counter = 0  # глобальная переменная

def increment():
    global counter
    counter += 1
```

Вызов `increment()` меняет глобальное состояние, и понять, почему `counter` стал, например, 42, будет сложнее.

***

### **2. Трудно отлаживать и тестировать**

* Любой участок кода может поменять глобальную переменную в любой момент.
* При отладке приходится искать, кто и где изменил значение.
* В юнит-тестах такие переменные сложно изолировать.

***

### **3. Проблемы с многопоточностью и асинхронностью**

* Если два потока или корутины изменяют глобальную переменную одновременно — возможны **гонки данных** (*race conditions*).
* Для потокобезопасности придётся использовать блокировки, что усложнит код.

***

### **4. Плохая переиспользуемость кода**

* Функция, завязанная на глобальные переменные, не универсальна — её нельзя легко перенести в другой проект.
* Такой код сложно сделать модульным.

***

### **5. Нарушение принципа&#x20;*****Dependency Injection***

* Вместо того чтобы передать нужные данные через параметры функции или конструктора класса, код “магически” использует глобалку.
* Это затрудняет понимание и поддержку.

***

### **6. Склонность к “магическим багам”**

* Значение глобальной переменной может измениться “по пути” вызова функций, и это приведёт к трудноуловимым ошибкам.

***

#### **Когда глобалки допустимы**

* Константы (имена в UPPER\_CASE)

  ```python
  API_URL = "https://api.example.com"
  TIMEOUT = 5
  ```
* Настройки, которые не меняются в процессе работы программы (например, версия приложения).

***

💡 **Вывод:** глобальные переменные делают код непредсказуемым, сложным для отладки и тестирования. Лучше передавать данные через параметры, использовать классы, конфигурационные объекты или *dependency injection*.
