# Изменяемые и неизменяемые типы данных

### **1. Изменяемые типы данных (mutable)**

* Их **содержимое можно изменять после создания**.
* Примеры: `list`, `dict`, `set`, пользовательские объекты (классы).

**Особенности:**

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

**Примеры:**

```python
lst = [1, 2, 3]
lst[0] = 10           # изменяем элемент
lst.append(4)         # добавляем элемент
lst.remove(2)         # удаляем элемент
print(lst)            # [10, 3, 4]

d = {"a": 1, "b": 2}
d["a"] = 10           # изменяем значение
```

***

### **2. Неизменяемые типы данных (immutable)**

* Их **содержимое нельзя изменить после создания**.
* Примеры: `int`, `float`, `bool`, `str`, `tuple`, `frozenset`, `bytes`.

**Особенности:**

* Любая операция, которая "меняет" объект, на самом деле создаёт **новый объект**.
* Можно использовать в качестве **ключей словарей** и элементов множеств.

**Примеры:**

```python
s = "hello"
s2 = s.upper()       # создаёт новый объект
print(s)             # "hello"
print(s2)            # "HELLO"

t = (1, 2, 3)
# t[0] = 10          # TypeError
```

***

### **3. Как отличать mutable и immutable**

| Признак      | Mutable                    | Immutable                                               |
| ------------ | -------------------------- | ------------------------------------------------------- |
| Изменяемость | Да                         | Нет                                                     |
| Копирование  | Поверхностное vs глубокое  | Не требуется, объект не меняется                        |
| Хешируемость | Нет                        | Да (можно использовать как ключ в dict или элемент set) |
| Примеры      | list, dict, set, bytearray | int, float, bool, str, tuple, frozenset, bytes          |

***

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

* **Mutable** удобно для изменения тестовых данных, подготовки сценариев:

```python
test_data = [1,2,3]
test_data.append(4)
assert test_data == [1,2,3,4]
```

* **Immutable** удобно для фиксации константных данных и ключей словарей:

```python
config_key = ("user_id", "session_id")
settings = {config_key: "value"}
```

* **Внимание к копированию**:

```python
import copy
a = [[1,2], [3,4]]
b = copy.copy(a)       # поверхностная копия
c = copy.deepcopy(a)   # глубокая копия
```

***

💡 **Вывод:**

* **Mutable** — изменяемые объекты (list, dict, set), их можно менять на месте.
* **Immutable** — неизменяемые объекты (int, str, tuple), любые операции создают новый объект.
* Понимание этих типов важно для **правильной работы с данными в автотестах** и предотвращения ошибок при копировании и сравнении объектов.


---

# 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/izmenyaemye-i-neizmenyaemye-tipy-dannykh.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.
