# Пространство имен

### **1. Что такое пространство имён**

* **Пространство имён** — это **контейнер, который сопоставляет имена переменных с объектами** (значениями).
* Оно отвечает за **видимость и область действия переменных**.

В Python есть несколько уровней пространства имён:

| Уровень                   | Где находится                                        | Пример поиска             |
| ------------------------- | ---------------------------------------------------- | ------------------------- |
| **Local (локальное)**     | Внутри функции или метода                            | Переменные внутри функции |
| **Enclosing (вложенное)** | Внутри внешней функции (если есть вложенные функции) | Замыкания (closures)      |
| **Global (глобальное)**   | На уровне модуля                                     | Переменные в файле Python |
| **Built-in (встроенное)** | Встроенные функции и объекты Python (`len`, `print`) | Python standard library   |

***

### **2. Пример**

```python
x = "глобальная переменная"

def outer():
    x = "внешняя переменная"
    def inner():
        x = "локальная переменная"
        print(x)  # ищет сначала локальное пространство
    inner()
    print(x)  # внешнее пространство
outer()
print(x)      # глобальное пространство
```

**Вывод:**

```
локальная переменная
внешняя переменная
глобальная переменная
```

***

### **3. Ключевые моменты**

1. **`global`** — позволяет использовать и изменять глобальную переменную внутри функции:

```python
x = 5
def modify_global():
    global x
    x += 1
modify_global()
print(x)  # 6
```

2. **`nonlocal`** — позволяет изменять переменную из внешней функции:

```python
def outer():
    x = 10
    def inner():
        nonlocal x
        x += 5
    inner()
    print(x)  # 15
outer()
```

***

### **4. Применение в автотестах**

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

```python
CONFIG = {"url": "https://example.com"}  # глобальное пространство

def test_login():
    username = "user1"  # локальное пространство
    password = "123"
    assert login(CONFIG["url"], username, password)
```

***

💡 **Вывод:**

* Пространства имён — это способ **управлять видимостью переменных**.
* Python использует **LEGB-последовательность** для поиска значения переменной.
* `global` и `nonlocal` позволяют **явно управлять областями видимости**.


---

# 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/prostranstvo-imen.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.
