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

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

***

### **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*.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/pochemu-globalnye-peremennye-eto-plokho.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
