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

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

### **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), любые операции создают новый объект.
* Понимание этих типов важно для **правильной работы с данными в автотестах** и предотвращения ошибок при копировании и сравнении объектов.
