# Домашнє завдання · 03 · Змінні та обʼєкти

> Лекція: [lecture.html](lecture.html) · Практика: [practice.ipynb](practice.ipynb) · Тест: [quiz.html](quiz.html)

Одна ідея на всі три рівні: **імʼя вказує на обʼєкт, а не вміщує його**.
Кожне завдання перевіряє, чи ти справді користуєшся цією моделлю, а не звичною
«коробкою зі значенням».

Усе роби в окремому файлі `dz_03.py` або в новому зошиті. Кожен пункт має щось
**друкувати** — інакше нема чого перевіряти.

---

## 🟢 Рівень 1 — База

Повтори головний дослід лекції на своїх даних.

1. Створи список із трьох улюблених фільмів і дай йому імʼя `фільми`.
2. Дай тому самому списку друге імʼя `улюблене`.
3. Додай четвертий фільм **через друге імʼя** (`улюблене.append(...)`).
4. Надрукуй `фільми` і доведи двома різними способами, що обʼєкт один:
   через `фільми is улюблене` і через порівняння `id(фільми)` з `id(улюблене)`.
5. Тепер зроби `справжня_копія = фільми.copy()`, додай туди пʼятий фільм і
   надрукуй обидва списки поруч.

**Зроблено, якщо:** у виводі видно, що після кроку 3 у `фільми` чотири назви,
`is` і порівняння `id()` обидва дають `True`, а після кроку 5 два списки
відрізняються й `фільми is справжня_копія` дає `False`.

---

## 🟡 Рівень 2 — Плюс

Тут `.copy()` тебе підведе — і треба зрозуміти чому.

1. Створи `розклад = [["пн"], ["вт"]]` — список, усередині якого лежать списки.
2. Зроби `копія = розклад.copy()`.
3. Виконай `копія[0].append("математика")`.
4. Надрукуй `розклад` і `копія`. Потім надрукуй `розклад[0] is копія[0]`.
5. Напиши коментарем 3–5 речень: скільки всього обʼєктів у памʼяті після кроку 2,
   що саме скопіював `.copy()`, і чому зміна всередині `копія[0]` видно в `розкладі`.
6. Знайди спосіб зробити копію, яка від цього захищена (підказка: модуль `copy`),
   і повтори кроки 3–4 з нею.

**Зроблено, якщо:** у виводі видно, що після `.copy()` слово «математика»
зʼявилось в **обох** списках, `розклад[0] is копія[0]` дає `True`,
пояснення написане своїми словами, а з другим способом копіювання той самий
`розклад` лишається без змін.

---

## 🔴 Рівень 3 — Виклик

Дослідження на межі: коли `is` бреше.

1. Напиши три рядки коду, після яких `a == b` дає `True`, а `a is b` — `False`.
2. Напиши три рядки, після яких обидва оператори дають `True`.
3. Для кожної пари надрукуй `id(a)`, `id(b)` і коментарем поясни, скільки
   обʼєктів створено.
4. Знайди експериментально межу кешу цілих чисел: перевір `a is b` для
   `a = n`, `b = int(str(n))` при `n`, що дорівнює 255, 256, 257, 258, і
   надрукуй результат для кожного.
5. Одним абзацом відповідай на питання: чому результат пункту 4 **не можна**
   використовувати в робочому коді, навіть якщо він стабільно відтворюється
   на твоєму компʼютері.

**Зроблено, якщо:** обидві пари з пунктів 1–2 працюють як заявлено, у виводі
пункту 4 видно зміну відповіді десь між 256 і 257, а в поясненні названо
головне: це деталь реалізації CPython, а не гарантія мови.

---

## Підказки

- Якщо не впевнений, що відбувається, — друкуй `id()` **до і після** кожної дії.
  Номер не змінився, а вміст змінився? Значить, обʼєкт той самий, і його бачать усі імена.
- Питай себе про кожен рядок лише дві речі: *скільки тут створено обʼєктів* і
  *що робить рядок — чіпляє ярлик чи міняє обʼєкт зсередини*.
- У рівні 2 корисно намалювати на папері квадратики-обʼєкти й стрілки-імена,
  як в інтерактиві 1. Помилку зазвичай видно ще до запуску коду.
- У рівні 3 не бери числа з літералів в одному рядку: усередині одного блоку коду
  компілятор може склеїти однакові сталі, і дослід зіпсується. `int(str(n))`
  гарантовано будує окремий обʼєкт.
